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
}

しかし、コードにエラーがあります。エラーはここにあります(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

変化する

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)
于 2012-05-04T14:09:08.050 に答える
1

データセット名を介して最初のテーブルにアクセスするのは正しくありません。これはXMLを設定するためです。

代わりに使用する

dt_dok.Tables[0].Rows.Count;

そうは言っても、これを個別のselect && insertではなく、単一のSQLステートメントとして記述する方がよいでしょう。このようにして、DBに何度もアクセスすることはありません。

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サーバーの例を参照していますが、更新の方法は異なります。

于 2012-05-07T09:05:37.510 に答える