【问题标题】:Invalid enumeration value and SqlDataAdapter.Update(DataTable)无效的枚举值和 SqlDataAdapter.Update(DataTable)
【发布时间】:2013-10-23 03:52:44
【问题描述】:

尝试通过 SqlDataAdapter.Update(DataTable) 更新数据表时,我收到 ArgumentOutOfRangeException“StatementType 枚举值 4 无效”。根据http://msdn.microsoft.com/en-us/library/system.data.statementtype(v=vs.100).aspx,可能的枚举值是 Select、Insert、Update、Delete 和 Batch,我猜 Batch 的值是 4。

我不确定这个值是如何设置的,因为它属于我在 SqlRowUpdatedEventHandler 中获取的 SqlRowUpdatedEventArgs 对象,或者它为什么无效。

基本上,我是从 Web 服务调用返回的 XmlNode 构建 DataTable,对数据视图进行排序,然后以 200 个为一组进行更新。

XmlNode result = null;
using (LeadService.ClientService service = new LeadService.ClientService())
{
    const string UserName = "SomeUserName";
    const string Password = "SomePassword";
    const int ChildReportId = 746;
    result = service.GetReportResults(UserName, Password, ChildReportId, null);
}

if (result.InnerXml != "")
{
    DataTable leads = new DataTable();
    leads.Columns.Add("ID1", typeof(int));
    leads.Columns.Add("ID2", typeof(string));
    leads.Columns.Add("CREATEDDATE", typeof(DateTime));

    foreach (XmlNode n in result.ChildNodes)
    {
        DataRow row = leads.NewRow();
        row["ID1"] = n["Id1"].InnerText;
        row["ID2"] = n["Id2"].InnerText;
        row["CREATEDDATE"] = n["DateAdded"].InnerText;
        leads.Rows.Add(row);
    }

    leads.DefaultView.Sort = "CREATEDDATE";
    DataTable newTable = leads.DefaultView.ToTable();
    newTable.AcceptChanges();
    foreach (DataRow r in newTable.Rows)
    {
        r.SetModified();
    }

    const string Update = "UPDATE SOMETHING SET ID1 = @ID1 WHERE ID2 = @ID2";

    using (SqlConnection con = new SqlConnection(Dal.GetConnectionString("CONNECTIONSTRING")))
    {
        SqlDataAdapter adap = new SqlDataAdapter();
        adap.UpdateCommand = new SqlCommand(Update);
        adap.UpdateCommand.Parameters.Add("@ID1", SqlDbType.NVarChar, 75, "ID1");
        adap.UpdateCommand.Parameters.Add("@ID2", SqlDbType.VarChar, 18, "ID2");
        adap.UpdateCommand.UpdatedRowSource = UpdateRowSource.None;
        adap.UpdateBatchSize = 200;
        adap.RowUpdated += new SqlRowUpdatedEventHandler(adap_RowUpdated);
        adap.Update(newTable);
    }
}

这是事件处理程序:

private static void adap_RowUpdated(object sender, SqlRowUpdatedEventArgs e)
{
    _rowsProcessed += e.RowCount;
    _recordsAffected += e.RecordsAffected;
}

【问题讨论】:

    标签: c# c#-4.0 datatable sqldataadapter


    【解决方案1】:

    哇!我没有在 SqlCommand 对象中设置连接!不确定奇怪错误背后的原因,但更改构造函数重载可以解决问题:

    using (SqlConnection con = new SqlConnection(Dal.GetConnectionString("CONNECTIONSTRING")))
    {
        SqlDataAdapter adap = new SqlDataAdapter();
        adap.UpdateCommand = new SqlCommand(Update, con);
        // ...
        adap.Update(newTable);
    }
    

    【讨论】:

    • 感谢您拯救了我的一天,这是连接字符串为空的问题,即使在 .Net 4.6.1 中也会出现一个晦涩的错误消息,请注意伙计们
    【解决方案2】:

    它可能认为您正在添加行而不是更新。尝试将 SetModified 移动到您的循环中:

    foreach (XmlNode n in result.ChildNodes)
    {
        DataRow row = leads.NewRow();
        row["ID1"] = n["Id1"].InnerText;
        row["ID2"] = n["Id2"].InnerText;
        row["CREATEDDATE"] = n["DateAdded"].InnerText;
        leads.Rows.Add(row);
        row.SetModified();
    }
    

    【讨论】:

    • leads 表实际上正在被排序并发送到一个新表(恰当地命名为newTable)。我刚刚在调试器中检查并添加了行状态值并调用newTable.AcceptChanges() 将它们设置为未更改。在循环中调用r.SetModified() 后,它们被设置为已修改。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-03-27
    • 1970-01-01
    • 1970-01-01
    • 2021-12-18
    • 1970-01-01
    • 2017-04-29
    • 2012-09-22
    相关资源
    最近更新 更多