8

私は C# の初心者なので、助けが必要です。今問題は、名、姓、住所などの多くのフィールドがある Windows フォームを設計したことです。フォームに入力して挿入ボタンをクリックすると、すべての情報がデータベースに入ります。誰もそれを行う方法を知っていますか?

private void button1_Click(object sender, System.EventArgs e)
{
    string connetionString = null;
    SqlConnection cnn ;
    SqlDataAdapter adapter = new SqlDataAdapter();
    string sql = null;
    connetionString = "Data Source=UMAIR;Initial Catalog=Air; Trusted_Connection=True;" ;

    cnn = new SqlConnection(connetionString);
    sql = "insert into Main (Firt Name, Last Name) values(textbox2.Text,textbox3.Text)";

    try
    {
        cnn.Open();
        adapter.InsertCommand = new SqlCommand(sql, cnn);
        adapter.InsertCommand.ExecuteNonQuery();
         MessageBox.Show ("Row inserted !! ");
    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.ToString());
    }
}
4

6 に答える 6

27

あなたのクエリには多くの問題があります。
これはあなたのコードの修正版です

string connetionString = null;
string sql = null;

// All the info required to reach your db. See connectionstrings.com
connetionString = "Data Source=UMAIR;Initial Catalog=Air; Trusted_Connection=True;" ;

// Prepare a proper parameterized query 
sql = "insert into Main ([Firt Name], [Last Name]) values(@first,@last)";

// Create the connection (and be sure to dispose it at the end)
using(SqlConnection cnn = new SqlConnection(connetionString))
{
    try
    {
       // Open the connection to the database. 
       // This is the first critical step in the process.
       // If we cannot reach the db then we have connectivity problems
       cnn.Open();

       // Prepare the command to be executed on the db
       using(SqlCommand cmd = new SqlCommand(sql, cnn))
       {
           // Create and set the parameters values 
           cmd.Parameters.Add("@first", SqlDbType.NVarChar).Value = textbox2.text;
           cmd.Parameters.Add("@last", SqlDbType.NVarChar).Value = textbox3.text;

           // Let's ask the db to execute the query
           int rowsAdded = cmd.ExecuteNonQuery();
           if(rowsAdded > 0) 
              MessageBox.Show ("Row inserted!!" + );
           else
              // Well this should never really happen
              MessageBox.Show ("No row inserted");

       }
    }
    catch(Exception ex)
    {
        // We should log the error somewhere, 
        // for this example let's just show a message
        MessageBox.Show("ERROR:" + ex.Message);
    }
}
  • 列名にはスペースが含まれているため(これは避ける必要があります)、それらを角括弧で囲む必要があります
  • using接続が閉じられ、リソースが解放されることを確認するには、ステートメントを使用する必要があります
  • コントロールを文字列に直接配置しますが、これは機能しません
  • 引用の問題や sqlinjiection 攻撃を避けるために、パラメータ化されたクエリを使用する必要があります
  • 単純な挿入クエリに DataAdapter を使用する必要はありません
  • バグの原因となる可能性があるため、AddWithValue は使用しないでください (以下のリンクを参照)。

これとは別に、他の潜在的な問題があります。ユーザーがテキスト ボックス コントロールに何も入力しない場合はどうなりますか? 挿入する前に、これについて何かチェックしましたか? 前述したように、フィールド名にはスペースが含まれているため、コードに不便が生じます。これらのフィールド名を変更してみてください。

このコードは、データベースの列が NVARCHAR 型であると想定しています。そうでない場合は、適切なSqlDbType 列挙値を使用します。

できるだけ早く、より新しいバージョンの NET Framework に切り替えることを計画してください。1.1 は本当に時代遅れです。

また、AddWithValue の問題については、この記事で避けるべき理由を説明します。AddWithValue() の使用をやめることはできますか?

于 2012-08-27T13:26:21.190 に答える
8

パラメーター化されたクエリを使用して SQL インジェクションを防止する (セキュリティの問題)

using ステートメントを使用して、接続が閉じられ、リソースが破棄されるようにします。

using(var connection = new SqlConnection("connectionString"))
{
    connection.Open();
    var sql = "INSERT INTO Main(FirstName, SecondName) VALUES(@FirstName, @SecondName)";
    using(var cmd = new SqlCommand(sql, connection))
    {
        cmd.Parameters.AddWithValue("@FirstName", txFirstName.Text);
        cmd.Parameters.AddWithValue("@SecondName", txSecondName.Text);

        cmd.ExecuteNonQuery();
    }
}
于 2012-08-27T13:30:11.510 に答える
5

SqlParametersを使用するようにコードを変更し、insert ステートメントを次のように調整する必要があります。

string connetionString = "Data Source=UMAIR;Initial Catalog=Air; Trusted_Connection=True;" ;
// [ ] required as your fields contain spaces!!
string insStmt = "insert into Main ([First Name], [Last Name]) values (@firstName,@lastName)";

using (SqlConnection cnn = new SqlConnection(connetionString))
{
    cnn.Open();
    SqlCommand insCmd = new SqlCommand(insStmt, cnn);
    // use sqlParameters to prevent sql injection!
    insCmd.Parameters.AddWithValue("@firstName", textbox2.Text);
    insCmd.Parameters.AddWithValue("@lastName", textbox3.Text);
    int affectedRows = insCmd.ExecuteNonQuery();
    MessageBox.Show (affectedRows + " rows inserted!");
}
于 2012-08-27T13:31:32.717 に答える
0
sql = "insert into Main (Firt Name, Last Name) values(textbox2.Text,textbox3.Text)";

(会社名)は有効なフィールドではありません。FirstName または First_Name である必要があります。それはあなたの問題かもしれません。

于 2012-08-27T13:30:36.160 に答える
-1

テキストボックスの内容を使用してコマンドを作成する必要があります。

sql = "insert into Main (Firt Name, Last Name) values(" + textbox2.Text + "," + textbox3.Text+ ")";

もちろん、これは、接続を正しく開くことができた場合に限ります。

現在のコードで何が起こっているかを知ることは役に立ちます。そのメッセージ ボックスにエラーが表示されている場合は、その内容を知っておくとよいでしょう。

また、実際にコマンドを実行する前に、入力を検証する必要があります (つまり、悪意のあるコードが含まれていないことを確認してください...)。

于 2012-08-27T13:23:53.813 に答える