我必须更新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语句中......
答案 0 :(得分: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();
答案 1 :(得分:1)
更改
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)
答案 2 :(得分:1)
通过数据集名称访问第一个表是不正确的,这是用于设置XML。
改为使用
dt_dok.Tables[0].Rows.Count;
话虽这么说,你最好把它写成一个单独的SQL语句而不是单独的select&&插入。这样你就不会多次去DB了。
var sql = @"if exists(select * from ordersstavke where SifParFil = ? and DokumentTip = ?)
then
-- do insert statement
else
-- do update
end if";
使用存储过程也可以做得更好,因此C#中没有尽可能多的SQL代码。以这种方式管理多个操作更容易。
为了大声哭泣,请使用SqlParameters
,而不是字符串连接!那只是在惹麻烦!
答案 3 :(得分: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”]。行[0] [“BrDok”]。ToString(),这里它给了我那个爱的错误:对象引用未设置为一个对象的实例。
也许MySQL上的更新以不同的方式进行,我在sql server上引用示例,并且更新有所不同