0

次のコードを使用して、ASP.NET のデータベースにデータを挿入しようとしています。

string conn = "TJLDatabaseConnectionString";
conn = ConfigurationManager.ConnectionStrings["Conn"].ToString();
SqlConnection objsqlconn = new SqlConnection(conn);
objsqlconn.Open();
SqlCommand objcmd = new SqlCommand("Insert into MeterReading(MachineName,LastReading,CurrentReading,Consumption) Values('" + TextBox1.Text + "','" + TextBox2.Text + "','" + TextBox3.Text + "','" + TextBox4.Text + "')", objsqlconn);
objcmd.ExecuteNonQuery();
//MessageBox.Show("Successful");

しかし、私がそれを実行すると。次のメッセージが表示されます。

4

3 に答える 3

2

最初に重要なのは、常に sql-parameters を使用して sql-injection を防ぐことです。パラメータを sql-query に連結しないでください。これにより、ローカリゼーションまたは「エスケープ」の問題も解決できます。

また、usingステートメントを使用して、管理されていないリソース (SQL 接続など) を使用するものはすべて閉じられ、エラーが発生した場合でも破棄されるようにします。

string sql = @"
INSERT INTO MeterReading(MachineName,LastReading,CurrentReading,Consumption) 
VALUES(@MachineName,@LastReading,@CurrentReading,@Consumption)";

using(var objsqlconn = new SqlConnection(ConfigurationManager.ConnectionStrings["Conn"].ToString()))
using (var cmd = new SqlCommand(sql, objsqlconn))
{
    cmd.Parameters.AddWithValue("@MachineName", TextBox1.Text);
    cmd.Parameters.AddWithValue("@LastReading", TextBox2.Text);
    cmd.Parameters.AddWithValue("@CurrentReading", TextBox3.Text);
    cmd.Parameters.AddWithValue("@Consumption", TextBox4.Text);
    objsqlconn.Open();
    int insertedCount = cmd.ExecuteNonQuery();
}

補足: ID 列があり、新しく作成された主キーを取得する場合は、次を使用する場合でも、SCOPE_IDENTITYandを使用します。ExecuteScalarINSERT INTO

string sql = @"
INSERT INTO MeterReading(MachineName,LastReading,CurrentReading,Consumption) 
VALUES(@MachineName,@LastReading,@CurrentReading,@Consumption); 
SELECT CAST(scope_identity() AS int)";

//...
int newID = (int)cmd.ExecuteScalar();
于 2013-10-11T08:38:25.200 に答える
0

変数を使用して、行が影響を受けているかどうかを確認します

 rowAffected= objcmd.ExecuteNonQuery();
             if(rowAffected >0)
              {
                //sucessful
              }
             else
              {
                //
              }
于 2013-10-11T08:38:06.060 に答える
0

あなたの質問には例外の言及がないので、より良い読みやすいコードのために、ブロックを使用することもお勧めします。きれいで読みやすいコードを提供し、オブジェクトがスコープ外になったときにオブジェクトを処理します。

これは、コーディング中に一般的に従う良い慣行のためのものです。適切な解決策の例外を教えてください。

private void ConnectToDb()
{

var conn = ConfigurationManager.ConnectionStrings["Conn"].ConnectionString;
using( var conn = new SqlConnection(conn))
{
 conn.Open();
 var cmdtxt ="Insert into MeterReading(MachineName,LastReading,CurrentReading,Consumption) 
Values(@P1,@P2,@P3,@P4)";
 using(var cmd = new SqlCommand(cmdtxt, conn))
 {
   cmd.CommandType=CommandType.Text;
   cmd.Parameters.AddWithValue("@P1", TextBox1.Text);
   cmd.Parameters.AddWithValue("@P2", TextBox2.Text);
   cmd.Parameters.AddWithValue("@P3", TextBox3.Text);
   cmd.Parameters.AddWithValue("@P4", TextBox4.Text);
   cmd.ExecuteNonQuery();

 }
 con.close();
}
}
于 2013-10-11T08:35:55.403 に答える