C# 更新/插入到表中

C# 更新/插入到表中,c#,sql-server,C#,Sql Server,我必须在SQL Server上更新表,但首先我必须检查表中是否有现有数据,以便如果有数据,则更新它,如果没有,则进行新的插入: cmd_sql.CommandText = " SELECT BrDok as id_dok " + " FROM ordersstavke " + " WHERE SifParFil = '" + rw_mat["sifskl_kor"] + "'" +

我必须在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\u dok.Tables[“dok\u MAT\u EXCHANGE”].Rows.Count==0

对象引用未设置为对象的实例


问题是在这个if语句中…

DOK\u MAT\u EXCHANGE
数据集的名称,而不是第一个表的名称

你应该试一下

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();

DOK\u MAT\u EXCHANGE
数据集的名称,而不是第一个表的名称

你应该试一下

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("DOK_MAT_EXCHANGE");


通过数据集名称访问第一个表是不正确的,这是为了设置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
,而不是字符串串联!那只是自找麻烦

通过数据集名称访问第一个表是不正确的,这是为了设置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
,而不是字符串串联!那只是自找麻烦

好的,谢谢各位,我是这样写的

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() + "'";

                    }
if(ds_dok.Tables[0].Rows.Count=1)
{
myQuery=“更新订单stavke”+
“设置BrDok=”+rw_mat[“BrDok”]+”+
“SifParFil=”+rw_mat[“sifskl_kor”]+“,”+
“WHERE BrDok=“+ds_dok.Tables[“ordersstavke”]。行[0][“BrDok”]。ToString()+”;
}
但是在更新部分有一个小问题:s_dok.Tables[“ordersstavke”].Rows[0][“BrDok”].ToString(),这里它给了我一个错误:对象引用未设置为对象的实例


也许MySQL上的更新方式不同,我参考了sql server上的示例,更新方式也不同

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

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() + "'";

                    }
if(ds_dok.Tables[0].Rows.Count=1)
{
myQuery=“更新订单stavke”+
“设置BrDok=”+rw_mat[“BrDok”]+”+
“SifParFil=”+rw_mat[“sifskl_kor”]+“,”+
“WHERE BrDok=“+ds_dok.Tables[“ordersstavke”]。行[0][“BrDok”]。ToString()+”;
}
但是在更新部分有一个小问题:s_dok.Tables[“ordersstavke”].Rows[0][“BrDok”].ToString(),这里它给了我一个错误:对象引用未设置为对象的实例


可能MySQL上的更新方式不同,我参考的是sql server上的示例,更新方式也不同

如果您不打算使用完整的存储过程,请从动态sql切换到参数化查询。无论何时使用动态SQL,您都会面临SQL注入攻击。直截了当:如果不打算使用完整的存储过程,请从动态SQL切换到参数化查询。无论何时使用动态SQL,您都会面临SQL注入攻击。直接从马嘴里说: