13

私はC#とSQLを初めて使用します。ここで、フォームからクラスの関数にアクセスします。

私のコードは

public void updateSupplierInformation(string id, string name, string balance, string place, string address, string phone, string bankname, string bankbranch, string accountno)
{
        if (conn.State == ConnectionState.Closed)
        {
            conn.Open();
        }

        SqlCommand NewCmd = conn.CreateCommand();
        NewCmd.Connection = conn;
        NewCmd.CommandType = CommandType.Text;
        NewCmd.CommandText = " update supplier set " + " ID = " + "'" + id + "'" + " , NAME = " + "'" + name + "'" + " , BALANCE = " + "'" + balance + "'" + " , PLACE = " + "'" + place + "'" + "  , LOCATION = " + "'" + address + "'" + ",  PHONE = " + "'" + phone + "'" + " , BANK_NAME = " + "'" + bankname + "'" + " , BANK_BRANCH = " + "'" + bankbranch + "'" + ", ACCOUNT_NO = " + "'" + accountno + "'" + " where ID = " + "@id";
        NewCmd.Parameters.AddWithValue("@id",id);
        NewCmd.ExecuteNonQuery(); 
        conn.Close();
    }

これで、指定されたデータベースにレコードが存在しない場合id、アプリケーションはすぐに停止します。どうすればこれを処理できますか?入力したデータが間違っているというメッセージを表示し、ユーザーに別のデータを入力するように依頼したい

4

5 に答える 5

27

ExecuteNonQuery()は、INSERT、UPDATE、またはDELETEステートメントの影響を受ける行数を返します。SQL例外をチェックする必要がある場合は、関数にtrycatchステートメントを含める必要があります。

public void updateSupplierInformation(string id, string name, string balance, string place, string address, string phone, string bankname, string bankbranch, string accountno)
    {
       try
       {
        if (conn.State == ConnectionState.Closed)
        {
            conn.Open();
        }

        SqlCommand NewCmd = conn.CreateCommand();
        NewCmd.Connection = conn;
        NewCmd.CommandType = CommandType.Text;
        NewCmd.CommandText = " update supplier set " + " ID = " + "'" + id + "'" + " , NAME = " + "'" + name + "'" + " , BALANCE = " + "'" + balance + "'" + " , PLACE = " + "'" + place + "'" + "  , LOCATION = " + "'" + address + "'" + ",  PHONE = " + "'" + phone + "'" + " , BANK_NAME = " + "'" + bankname + "'" + " , BANK_BRANCH = " + "'" + bankbranch + "'" + ", ACCOUNT_NO = " + "'" + accountno + "'" + " where ID = " + "@id";
        NewCmd.Parameters.AddWithValue("@id",id);
        int a=NewCmd.ExecuteNonQuery(); 
        conn.Close();
        if(a==0)
          //Not updated.
        else
          //Updated.
        }
        catch(Exception ex)
         {
         // Not updated
         }
    }
于 2013-01-12T12:24:33.053 に答える
22

ExecuteNonQuery影響を受ける行の数を返します。0の場合、更新する一致する行がなかったことを意味します。もちろん、それは例外をスローしないという点で更新が実際に「機能する」場合のみです...一方、あなたの場合は例外をスローしていると思われますが、これはおそらくデータベースに存在しない行とは関係ありません(存在する行に依存する、表示していないコードがある可能性があります。気を付けてください

さらに:

  • SQLに直接値を含めるのではなく、すべてのパラメーターにパラメーター化されたSQLを使用する必要があります。
  • usingリソースを確実に廃棄するには、ステートメントを使用する必要があります。
  • 単一の接続を使用しているようです。そうしないでください。usingデータベース操作を実行するたびに新しい接続を作成(および経由で破棄)し、接続プールに効率を処理させます
  • アプリケーションが停止している理由を理解してください。例外はほぼ確実にスローされます。例外が発生した場合は、例外の詳細を取得することが非常に重要です。正確なコンテキストに応じて、それをキャッチして(ある程度の高レベルで)続行したい場合があります...しかし、常に少なくともログに記録する必要があります。

私の推測では(簡単な検査で)、問題は、更新ステートメントがIDを更新しようとすることです。これはおそらく読み取り専用です。しかし、例外処理を修正すると、それがわかります。

于 2013-01-12T12:10:55.153 に答える
1

すでに回答が投稿されていることは知っていますが、別のことを試してみましょう。

SqlConnection SQLConn = new SqlConnection("datahere");
SqlCommand SQLComm = new SqlCommand();
SQLcomm.Connection = SQLConn;
SQLConn.Open();
SQLComm.CommandText = "SQL statement goes here"
SqlDataReader dataReader = SQLComm.ExecuteReader();
dataReader.Read();
if(dataReader.HasRows == true){ //if it has rows do code
//do code
}
else{
// do other code
}

HasRowsはbool値を返します

于 2016-11-25T13:46:53.823 に答える
1

状態を確認するだけ

int a=NewCmd.ExecuteNonQuery(); 
    if(a==0)
      //Not updated.
    else
      //Updated.

ExecuteNonQuery()->この関数は整数値を返します。

ありがとうございました

于 2019-12-19T07:35:19.713 に答える
0

sql =UPDATE TABLE SET column = '${data}' WHERE column = "value

db.query(sql, (err, result)=> {
            
            console.log(result.affectedRows);
            if(err) {
                console.log(err);
                return res.send({
                    message: "Error occured. please retry",
                });
            } else if(result.affectedRows != 0) {
                console.log(result)
                return res.send({
                    success:true,
                    message: "updated!"
                });

            }else if(result.affectedRows == 0) {
                console.log(result)
                return res.send({
                    success:false,
                    message: "not updated!"
                });
            } else {
                console.log(result)
            }
        })
//this is a nodejs code
于 2021-02-25T10:12:32.103 に答える