4

テーブルstudent( id, name) があります。次に、名前を入力するためのテキストボックスが1つあります。送信ボタンをクリックすると、データがデータベースに挿入されます。IDは自動インクリメントであるため、IDではなく名前のみに挿入するにはどうすればよいですか?

私はこれを試しました

insert into student(id, name) values(,name) 

しかし、それは私のテーブルに挿入されていません。

これは私のコードです:

protected void Button1_Click(object sender, EventArgs e)
{
    string test = txtName.Text;

    SqlConnection conn = new SqlConnection(@"Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirectory|\Person.mdf;Integrated Security=True;User Instance=True");

    string sql = "insert into student(name) values ('test')";

    try
    {
        conn.Open();
        SqlCommand cmd = new SqlCommand(sql, conn);
        cmd.ExecuteNonQuery();
    }
    catch (System.Data.SqlClient.SqlException ex)
    {
        string msg = "Insert Error:";
        msg += ex.Message;
    }
    finally
    {
        conn.Close();
    }
}
4

7 に答える 7

17
INSERT INTO student (name) values ('name')

列を完全に省略するidと、自動的に入力されます。変数を使用するには、SQL クエリをパラメーター化する必要があります。

string sql = "INSERT INTO student (name) values (@name)";
conn.Open();
SqlCommand cmd = new SqlCommand(sql, conn);
cmd.Parameters.Add("@name", SqlDbType.VarChar);
cmd.Parameters["@name"].Value = test;
cmd.ExecuteNonQuery();

コードが SQL インジェクションの脆弱性にさらされる可能性があるため、入力値を含む SQL 文字列を作成してこれを実行しようとしないでください。

于 2012-06-14T09:25:56.133 に答える
2

データを挿入するときは、パラメーターを使用することをお勧めします。

try
{
    string sql = "insert into student(name) values (@name)";
    using (SqlConnection conn = new SqlConnection(connectionString))
    {
        conn.Open();
        using (SqlCommand cmd = new SqlCommand(sql, conn))
        {
            cmd.Parameters.AddWithValue("@name", test); // assign value to parameter 
            cmd.ExecuteNonQuery();
        }
    }
}
catch (SqlException ex)
{
    string msg = "Insert Error:";
    msg += ex.Message;
}
于 2012-06-14T09:45:30.980 に答える
1

私はこの問題に直面していましたが、スタック オーバーフローで見つかったさまざまな解決策を試した後、経験を次のように要約できました。mssql のコマンド シェルで実行されるコマンドは次のようになります。

insert into table_name (val1,val2,val3,val4) VALUES ("val1","val2",0,"val4")

go

また

insert into table_name VALUES ("val1","val2",0,"val4")

go

mssql データベース プロンプトに直接入力すると機能します。

ただし、C# の挿入ステートメントを使用する必要がある場合は、次のように、文字列を追加の 1 組の quiet で囲み、文字列を囲む必要があることに注意する必要があります。

SqlConnection cnn;

string connetionString = "Data Source=server_name;Initial Catalog=database_name;User ID=User_ID;Password=Pass_word";

cnn = new SqlConnection(connetionString);

SqlCommand myCommand = new SqlCommand("insert into table_name (val1,val2,val3,val4) VALUES ('val1','val2',0,'val4');", cnn);

//or
//SqlCommand myCommand = new SqlCommand(insert into table_name VALUES ('val1','val2',0,'val4');", cnn);

cnn.Open();

myCommand.ExecuteNonQuery();

cnn.Close();

ここでの問題は、私のようなほとんどの人が、上記のコマンド ラインの場合のように実装されている二重引用符 <"> の代わりに <\"> を使用しようとすることであり、SQL エグゼキュータはこれの意味を理解できません。

文字列を置換する必要がある場合でも、次のように、文字列連結が実行可能な解決策のように見える場合、文字列が単一引用符で囲まれていることを確認してください。

SqlCommand myCommand = new SqlCommand("insert into table_name (val1,val2,val3,val4) VALUES ('"+val1+"','val2',0,'val4');", cnn);
于 2013-01-17T04:11:32.883 に答える
1
string sql = "INSERT INTO student (name) values (@name)";
conn.Open();
SqlCommand cmd = new SqlCommand(sql, conn);
cmd.Parameters.Add("@name", SqlDbType.VarChar);
cmd.Parameters["@name"].Value = test;
cmd.ExecuteNonQuery();
于 2012-06-14T11:06:45.793 に答える
0

キーワード「identity」を使用して、id 列を自動インクリメントします

参照: http://technet.microsoft.com/en-us/library/aa933196(v=sql.80).aspx

create table table_name( id int PRIMARY KEY IDENTITY ) 

挿入クエリで「id」に言及する必要はありません

于 2013-10-22T09:06:08.903 に答える