列不允许 DBNull.Value,删除也无济于事。为什么?
Column does not allow DBNull.Value and Remove does not help. Why?
我收到错误:
Column 'Code' does not allow DBNull.Value
这是我的代码:
public async Task UpdateDBWithXML(XmlReader reader, string hashKey, string hash)
{
var table = new DataTable();
table.Columns.Add("Code");
table.Columns.Add("ShortName");
table.Columns.Add("Name");
table.Columns.Add("LegalAddress");
table.Columns.Add("Status");
using (var transaction = this.Context.Database.BeginTransaction(IsolationLevel.ReadUncommitted))
using (var sqlBulk = new SqlBulkCopy((SqlConnection)this.Connection, SqlBulkCopyOptions.Default, transaction.UnderlyingTransaction as SqlTransaction))
{
this.Context.Database.ExecuteSqlCommand("DELETE FROM [dbo].[LegalContractors]");
sqlBulk.DestinationTableName = "LegalContractors";
string lastElement = null;
DataRow lastRow = null;
while (reader.Read())
{
switch (reader.NodeType)
{
case XmlNodeType.Element:
if(reader.Name == "RECORD")
{
if (table.Rows.Count > 0 && lastRow.IsNull("Code"))
{
table.Rows.Remove(lastRow);
}
if (table.Rows.Count > 10000)
{
await sqlBulk.WriteToServerAsync(table);
table.Rows.Clear();
}
lastRow = table.Rows.Add();
}
lastElement = reader.Name;
break;
case XmlNodeType.Text:
ProcessList(lastElement, reader.Value, lastRow);
break;
}
}
if (table.Rows.Count > 0 && lastRow.IsNull("Code"))
{
table.Rows.Remove(lastRow);
}
if (table.Rows.Count > 0)
{
await sqlBulk.WriteToServerAsync(table);
table.Rows.Clear();
}
//update hash here
transaction.Commit();
}
}
private void ProcessList(string lastElement, string value, DataRow row)
{
switch (lastElement)
{
case "NAME":
row["Name"] = value;
break;
case "SHORT_NAME":
row["ShortName"] = value;
break;
case "EDRPOU":
row["Code"] = value;
break;
case "ADDRESS":
row["LegalAddress"] = value;
break;
case "STAN":
row["Status"] = value;
break;
}
}
如您所见,我正在删除空 'Code' 的数据行。为什么会发生错误呢?我应该使用不同的 API 进行删除吗?
我尝试了 this 问题中建议的方法:使用 lastRow["Code"] == DBNull.Value
而不是 lastRow.IsNull("Code")
。这也没有帮助。
这是示例XML我正在解析:
<?xml version="1.0" encoding="windows-1251"?>
<DATA FORMAT_VERSION="1.0">
<RECORD>
<NAME>МІЖНАРОДНА ГРОМАДСЬКА ОРГАНІЗАЦІЯ МІЖНАРОДНА АКАДЕМІЯ БІОЕНЕРГОТЕХНОЛОГІЙ</NAME>
<SHORT_NAME>МАБЕТ</SHORT_NAME>
<EDRPOU>00011601</EDRPOU>
<ADDRESS>01001, м.Київ, Шевченківський район, ВУЛИЦЯ ПРОРІЗНА, будинок 8, офіс 426</ADDRESS>
<BOSS>ТКАЧЕНКО ВОЛОДИМИР АНДРІЙОВИЧ</BOSS>
<KVED>94.12 Діяльність професійних громадських організацій</KVED>
<STAN>зареєстровано</STAN>
<FOUNDERS>
<FOUNDER>Члени організації, розмір внеску до статутного фонду - 0.00 грн.</FOUNDER>
</FOUNDERS>
</RECORD>
<RECORD>
<NAME>фоо</NAME>
<SHORT_NAME>фоо короткое имя</SHORT_NAME>
<EDRPOU></EDRPOU>
<ADDRESS>фоо адрес</ADDRESS>
<BOSS>фоо бос</BOSS>
<KVED>фоо квед</KVED>
<STAN>фоо состояние</STAN>
<FOUNDERS>
<FOUNDER>фоо организатор</FOUNDER>
</FOUNDERS>
</RECORD>
</DATA>
您可以允许 DBNull
通过创建新的 DataColumn
列 code
:
DataTable table = new DataTable();
DataColumn code = new DataColumn("code");
code.AllowDBNull = true;
table.Columns.Add(code);
希望对您有所帮助。
您的 XML 不包含名为代码的列,ProcessList() 也没有创建它。但它在您的 table 定义中,因此看起来它始终为空。
我怀疑您的 SQL Table 结构设置了 Code 列不允许空值,因此 SQL 更新引发了错误。
您需要用某些东西填充代码列,或者将其设置为允许空值或在数据库中具有默认值。
我收到错误:
Column 'Code' does not allow DBNull.Value
这是我的代码:
public async Task UpdateDBWithXML(XmlReader reader, string hashKey, string hash)
{
var table = new DataTable();
table.Columns.Add("Code");
table.Columns.Add("ShortName");
table.Columns.Add("Name");
table.Columns.Add("LegalAddress");
table.Columns.Add("Status");
using (var transaction = this.Context.Database.BeginTransaction(IsolationLevel.ReadUncommitted))
using (var sqlBulk = new SqlBulkCopy((SqlConnection)this.Connection, SqlBulkCopyOptions.Default, transaction.UnderlyingTransaction as SqlTransaction))
{
this.Context.Database.ExecuteSqlCommand("DELETE FROM [dbo].[LegalContractors]");
sqlBulk.DestinationTableName = "LegalContractors";
string lastElement = null;
DataRow lastRow = null;
while (reader.Read())
{
switch (reader.NodeType)
{
case XmlNodeType.Element:
if(reader.Name == "RECORD")
{
if (table.Rows.Count > 0 && lastRow.IsNull("Code"))
{
table.Rows.Remove(lastRow);
}
if (table.Rows.Count > 10000)
{
await sqlBulk.WriteToServerAsync(table);
table.Rows.Clear();
}
lastRow = table.Rows.Add();
}
lastElement = reader.Name;
break;
case XmlNodeType.Text:
ProcessList(lastElement, reader.Value, lastRow);
break;
}
}
if (table.Rows.Count > 0 && lastRow.IsNull("Code"))
{
table.Rows.Remove(lastRow);
}
if (table.Rows.Count > 0)
{
await sqlBulk.WriteToServerAsync(table);
table.Rows.Clear();
}
//update hash here
transaction.Commit();
}
}
private void ProcessList(string lastElement, string value, DataRow row)
{
switch (lastElement)
{
case "NAME":
row["Name"] = value;
break;
case "SHORT_NAME":
row["ShortName"] = value;
break;
case "EDRPOU":
row["Code"] = value;
break;
case "ADDRESS":
row["LegalAddress"] = value;
break;
case "STAN":
row["Status"] = value;
break;
}
}
如您所见,我正在删除空 'Code' 的数据行。为什么会发生错误呢?我应该使用不同的 API 进行删除吗?
我尝试了 this 问题中建议的方法:使用 lastRow["Code"] == DBNull.Value
而不是 lastRow.IsNull("Code")
。这也没有帮助。
这是示例XML我正在解析:
<?xml version="1.0" encoding="windows-1251"?>
<DATA FORMAT_VERSION="1.0">
<RECORD>
<NAME>МІЖНАРОДНА ГРОМАДСЬКА ОРГАНІЗАЦІЯ МІЖНАРОДНА АКАДЕМІЯ БІОЕНЕРГОТЕХНОЛОГІЙ</NAME>
<SHORT_NAME>МАБЕТ</SHORT_NAME>
<EDRPOU>00011601</EDRPOU>
<ADDRESS>01001, м.Київ, Шевченківський район, ВУЛИЦЯ ПРОРІЗНА, будинок 8, офіс 426</ADDRESS>
<BOSS>ТКАЧЕНКО ВОЛОДИМИР АНДРІЙОВИЧ</BOSS>
<KVED>94.12 Діяльність професійних громадських організацій</KVED>
<STAN>зареєстровано</STAN>
<FOUNDERS>
<FOUNDER>Члени організації, розмір внеску до статутного фонду - 0.00 грн.</FOUNDER>
</FOUNDERS>
</RECORD>
<RECORD>
<NAME>фоо</NAME>
<SHORT_NAME>фоо короткое имя</SHORT_NAME>
<EDRPOU></EDRPOU>
<ADDRESS>фоо адрес</ADDRESS>
<BOSS>фоо бос</BOSS>
<KVED>фоо квед</KVED>
<STAN>фоо состояние</STAN>
<FOUNDERS>
<FOUNDER>фоо организатор</FOUNDER>
</FOUNDERS>
</RECORD>
</DATA>
您可以允许 DBNull
通过创建新的 DataColumn
列 code
:
DataTable table = new DataTable();
DataColumn code = new DataColumn("code");
code.AllowDBNull = true;
table.Columns.Add(code);
希望对您有所帮助。
您的 XML 不包含名为代码的列,ProcessList() 也没有创建它。但它在您的 table 定义中,因此看起来它始终为空。
我怀疑您的 SQL Table 结构设置了 Code 列不允许空值,因此 SQL 更新引发了错误。
您需要用某些东西填充代码列,或者将其设置为允许空值或在数据库中具有默认值。