1

我必须更新 SQL Server 上的表,但首先我必须检查表中的现有数据,因此如果数据存在则更新它,如果没有则进行新插入:

cmd_sql.CommandText = " SELECT BrDok as id_dok " +
                      " FROM ordersstavke " +
                      " WHERE SifParFil = '" + rw_mat["sifskl_kor"] + "'" +
                      " AND DokumentTip = '" + rw_mat["vrst_dok"] + "'";

MySqlDataAdapter sql_adapter = new MySqlDataAdapter(cmd_sql);
DataSet dt_dok = new DataSet("DOK_MAT_EXCHANGE");
sql_adapter.Fill(dt_dok);

if (dt_dok.Tables["DOK_MAT_EXCHANGE"].Rows.Count == 0)
{
   myQuery = " INSERT INTO ordersstavke (BrDok, DocumentTip, SifParFil) " +
             " VALUES ('" + rw_mat["brdok"] + "', '" +
                            rw_mat["vrst_dok"] + "', '" +
                            rw_mat["sifskl_kor"] + "')";
}
else
{
    UPDATE DATA
}

但是我的代码有错误,错误就在这里 if ( dt_dok.Tables["DOK_MAT_EXCHANGE"].Rows.Count == 0)

你调用的对象是空的。

问题出在这个 if 语句中......

4

4 回答 4

4

DOK_MAT_EXCHANGE是 的名称,而DataSet不是第一个表的名称。

你应该用

if (dt_dok.Tables[0].Rows.Count == 0) 

另外,我认为最好使用这样的语法来发现有多少记录

cmd_sql.CommandText = "SELECT COUNT(BrDok) as id_dok " +
                      " FROM ordersstavke " +                         
                      " WHERE SifParFil = ?p1 " +                         
                      " AND DokumentTip = ?p2";   
cmd_sql.Parameters.AddWithValue("?p1", rw_mat["sifskl_kor"] );
cmd_sql.Parameters.AddWithValue("?p2", rw_mat["vrst_dok"] );
int rowCount = (Int32)cmd_sql.ExecuteScalar();
于 2012-05-04T14:06:42.113 回答
1

change

DataSet dt_dok = new DataSet("DOK_MAT_EXCHANGE");

to

DataSet dt_dok = new DataSet("ordersstavke ");

and

if (dt_dok.Tables["DOK_MAT_EXCHANGE"].Rows.Count == 0)

to

if (dt_dok.Tables["ordersstavke "].Rows.Count == 0)
于 2012-05-04T14:09:08.050 回答
1

通过数据集名称访问第一个表是不正确的,这是为了设置 XML。

而是使用

dt_dok.Tables[0].Rows.Count;

话虽如此,您最好将其编写为单个 SQL 语句,而不是单独的 select && insert。这样您就不会多次访问数据库。

var sql = @"if exists(select * from ordersstavke where SifParFil = ? and DokumentTip = ?)
then 
 -- do insert statement
else
 -- do update
end if";

使用存储过程也可以更好地完成此操作,因此您在 C# 中没有那么多 SQL 代码。以这种方式管理多个操作更容易。

而对于大声喊叫,使用SqlParameters,而不是字符串连接!那简直是自找麻烦!

于 2012-05-04T14:17:39.427 回答
0

好的,谢谢大家,我是这样写的

if (ds_dok.Tables[0].Rows.Count <= 0)
                    {
                        myQuery = " INSERT INTO ordersstavke (BrDok, " +
                                  " SifParFil) " +
                                  " VALUES ('" + rw_mat["brdok"] + "', '" +
                                                 rw_mat["sifskl_kor"] + "')";
                    }
                    else if (ds_dok.Tables[0].Rows.Count >= 1)
                    {

                        myQuery = "UPDATE ordersstavke " +
                                  "SET BrDok = '" + rw_mat["brdok"] + "', " +
                                  "SifParFil = '" + rw_mat["sifskl_kor"] + "', " +
                                  "WHERE BrDok = " + ds_dok.Tables["ordersstavke"].Rows[0]["BrDok"].ToString() + "'";

                    }

但是在更新部分有一个小问题:s_dok.Tables["ordersstavke"].Rows[0]["BrDok"].ToString(),这里它给了我一个可爱的错误:对象引用未设置为实例一个东西。

也许 MySQL 上的更新方式不同,我在 sql server 上引用示例,更新方式不同

于 2012-05-07T09:05:37.510 回答