我收到错误:
列'代码'不允许使用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;
}
}
如您所见,我正在删除带有空“代码”的DataRows。为什么会发生错误呢?我应该使用其他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
允许code
进入列DataColumn
:DataTable table = new DataTable();
DataColumn code = new DataColumn("code");
code.AllowDBNull = true;
table.Columns.Add(code);
我希望能帮到您。
我怀疑您的SQL表结构已将列Code不允许为空,因此SQL更新会引发错误。
您需要在“代码”列中填充某些内容,或将其设置为允许空值或在数据库中具有默认值。