更新/插入到表中
本文关键字:插入 更新 | 更新日期: 2023-09-27 18:33:07
我必须在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
}
但是我在代码中有一个错误,如果(dt_dok.Tables["DOK_MAT_EXCHANGE"].Rows.Count == 0
对象引用未设置为对象的实例。
问题出在这个if语句中...
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();
更改
DataSet dt_dok = new DataSet("DOK_MAT_EXCHANGE");
自
DataSet dt_dok = new DataSet("ordersstavke ");
和
if (dt_dok.Tables["DOK_MAT_EXCHANGE"].Rows.Count == 0)
自
if (dt_dok.Tables["ordersstavke "].Rows.Count == 0)
通过数据集名称访问第一个表是不正确的,这是为了设置 XML。
而是使用
dt_dok.Tables[0].Rows.Count;
话虽如此,您最好将其编写为单个SQL语句,而不是单独的选择&&插入。 这样,您就不会多次访问数据库。
var sql = @"if exists(select * from ordersstavke where SifParFil = ? and DokumentTip = ?)
then
-- do insert statement
else
-- do update
end if";
使用存储的过程也可以更好地完成此操作,因此 C# 中没有那么多 SQL 代码。 以这种方式管理多个操作更容易。
对于大声哭泣,请使用SqlParameters
,而不是字符串连接!那只是自找麻烦!
好的,谢谢大家,我是这样写的
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"]。行[0]["BrDok"]。ToString(),这里它给了我一个可爱的错误:对象引用未设置为对象的实例。
也许MySQL上的更新以不同的方式进行,我引用的是sql服务器上的示例,并且更新有所不同