使用数据适配器更新数据集更改似乎无法正常工作

时间:2011-05-14 05:01:25

标签: c# data-binding

我想将数据集更改更新到我的数据库,所以我使用了这种代码:

SqlCommandBuilder mySqlCommandBuilder = new SqlCommandBuilder(sqladap);
sqladap.Update(ds, TableName);

虽然它工作正常但我已将此代码用于我项目中的另一个数据集,但第二个不起作用。我跟踪了这​​段代码,看到了数据集的行。它包含最后提取的行和新行,但SQLDataAdapter更新任何数据,也不会引发错误。

这是完整的代码:

public static SqlDataAdapter AdapterStoredProcedure(string sp_Name, object obj)
{
        ClsEventLogs EventLogs = new ClsEventLogs();
        try
        {
            SqlConnection connection = SQLDBConnection();

            SqlDataAdapter sqladap = new SqlDataAdapter(sp_Name, connection);
            sqladap.SelectCommand.CommandType = CommandType.StoredProcedure;

            if (obj != null)
            {
                Type t = obj.GetType();
                string str = string.Empty;
                System.Reflection.FieldInfo[] fields = t.GetFields();
                foreach (System.Reflection.FieldInfo field in fields)
                {
                    sqladap.SelectCommand.Parameters.Add(new SqlParameter(field.Name, SqlDbType.VarChar, 200));
                    sqladap.SelectCommand.Parameters[field.Name].Value = field.GetValue(obj).ToString();
                }
            }                
            return sqladap;
        }
        catch(Exception er)
        {
            EventLogs.Eventlog("clsDataStore : ExecuteStoredProcedure", er.Message, ClsEventLogs.EventType.etCriticalError, false);
            return null;
        }            
    }

// Creating Adapter

SqlDataAdapter dAdap = null;
DataSet ds = new DataSet();
dAdap = clsDataStore.AdapterStoredProcedure("sp_SelectTbl_Client", null);            
dAdap.Fill(ds, "tbl_client");

//here is where i'm Updating the dataset
SqlCommandBuilder mySqlCommandBuilder = new SqlCommandBuilder(sqladap);
sqladap.Update(ds, TableName);

2 个答案:

答案 0 :(得分:0)

问一个愚蠢的问题:你是否在调用Update方法后告诉适配器提交更改?

编辑好的,既然您已经发布了代码,我还要问另一个愚蠢的问题:您在考虑确定更新是否有效?您现在是连接到远程数据库还是项目中的测试数据库?如果是后者,那么如果你每次都在重建(这是我习惯做的事情)那么你的数据库工作副本(在\bin目录中)会被吹走并被一个新的副本取代无论在项目中引用它的哪个地方。当然,这假设您使用的是嵌入式数据库(如MSSQLCE)。

答案 1 :(得分:0)

您必须在生成的SQL Update / Insert语句中查找(调试器)。他们很可能是有缺陷的,甚至是空的。

CommandBuilder非常有限,它只处理非常简单的SELECT a,b FROM table语句。

您可能会发现不起作用的SP包含JOIN,计算列或类似的内容。

最佳课程:提供您自己的更新语句或SP