0

此代码成功地在 SQL 数据库中插入新值,但仅在我插入常量值时。
我需要**(?)**以下代码中的帮助,我想在其中插入新值而不在代码中指定常量。我的意思是,我希望能够在输出窗口中输入任何随机值并将其插入 SQL 数据库。

private void InsertInfo()
{
    String strConnection = "Data Source=HP\\SQLEXPRESS;database=MK;Integrated Security=true";

    SqlConnection con = new SqlConnection(strConnection);
    string connetionString = null;
    SqlConnection connection ;
    SqlDataAdapter adapter = new SqlDataAdapter();

    connetionString = @"Data Source=HP\SQLEXPRESS;database=MK;Integrated Security=true";
    connection = new SqlConnection(connetionString);
    string sql = "insert into record (name,marks) **values( ?))";**

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

private void insert_Click(object sender, EventArgs e)
{
    InsertInfo();
}
4

2 回答 2

2

这里不需要使用适配器;这对你没有帮助。只是:

var name = ...
var marks = ...
using(var conn = new SqlConnection(connectionString))
using(var cmd = conn.CreateCommand()) {
    cmd.CommandText = "insert into record (name, marks) values (@name, @marks)";
    cmd.Parameters.AddWithValue("name", name);
    cmd.Parameters.AddWithValue("marks", marks);
    conn.Open();
    cmd.ExecuteNonQuery();
}

或使用“dapper”之类的工具:

var name = ...
var marks = ...
using(var conn = new SqlConnection(connectionString)) {
    conn.Open();
    conn.Execute("insert into record (name, marks) values (@name, @marks)",
        new {name, marks});
}
于 2013-02-25T08:24:06.880 回答
0

那些 '?' 被称为参数。据我了解,您希望对插入使用参数化查询,这是一种很好的方法,因为它们可以避免 SQL 注入的机会。这 '?' 当您使用

OLEDBConnection 和命令对象。

通常,您将使用“@”符号在查询中指定参数。不需要适配器。你刚才

//Bind parameters
// Open your Connection
// Execute your query
// Close connection
// return result

参数化查询来自 Rolla 的 4 Guys

MSDN:如何防止 ASP.NET 中的 SQL 注入

于 2013-02-25T08:34:04.173 回答