我是一个新的VisualC#,我对如何编写参数化查询感到困惑。这是我没有他们的密码,
using System;
using System.Windows.Forms;
using System.Data.SqlClient;
namespace Insert_Data
{
public partial class Form1 : Form
{
private void button1_Click(object sender, EventArgs e)
{
SqlConnection con = new SqlConnection("Data Source=ZTABASSUM\\SQLEXPRESS01;Initial Catalog=IntroDataBase;Integrated Security=True");
con.Open();
SqlCommand sc = new SqlCommand("Insert into employee values ('"+ textBox1.Text +"' , " + textBox2.Text + ", '" + textBox3.Text + "', " + textBox4.Text + ", " + textBox5.Text + ");", con);
int o = sc.ExecuteNonQuery();
MessageBox.Show(o + ":Record has been inserted");
con.Close();
}
}
}我不确定如何为每个文本框编写参数化查询。
发布于 2016-07-25 19:00:07
我在代码中添加了注释,并在后面添加了一个best practices重述。
// best practice - use meaningful method names
private void buttonSaveEmployee_Click(object sender, EventArgs e)
{
// best practice - wrap all database connections in a using block so they are always closed & disposed even in the event of an Exception
// best practice - retrieve the connection string by name from the app.config or web.config (depending on the application type) (note, this requires an assembly reference to System.configuration)
using(SqlConnection con = new SqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings["MyConnectionName"].ConnectionString))
{
// best practice - use column names in your INSERT statement so you are not dependent on the sql schema column order
// best practice - always use parameters to avoid sql injection attacks and errors if malformed text is used like including a single quote which is the sql equivalent of escaping or starting a string (varchar/nvarchar)
// best practice - give your parameters meaningful names just like you do variables in your code
SqlCommand sc = new SqlCommand("INSERT INTO employee (FirstName, LastName, DateOfBirth /*etc*/) VALUES (@firstName, @lastName, @dateOfBirth /*etc*/)", con);
// best practice - always specify the database data type of the column you are using
// best practice - check for valid values in your code and/or use a database constraint, if inserting NULL then use System.DbNull.Value
sc.Parameters.Add(new SqlParameter("@firstName", SqlDbType.VarChar, 200){Value = string.IsNullOrEmpty(textBoxFirstName.Text) ? (object) System.DBNull.Value : (object) textBoxFirstName.Text});
sc.Parameters.Add(new SqlParameter("@lastName", SqlDbType.VarChar, 200){Value = string.IsNullOrEmpty(textBoxLastName.Text) ? (object) System.DBNull.Value : (object) textBoxLastName.Text});
// best practice - always use the correct types when specifying your parameters, in this case a string is converted to a DateTime type before being assigned to the SqlParameter.Value
// note - this is not a very robust way to parse a date as the user is never notified in the event of failure, the purpose here is simply to show how to use parameters of various types
DateTime dob;
sc.Parameters.Add(new SqlParameter("@dateOfBirth", SqlDbType.Date){Value = DateTime.TryParse(textBoxDateOfBirth.Text, out dob) ? (object) dob : (object) System.DBNull.Value});
// best practice - open your connection as late as possible unless you need to verify that the database connection is valid and wont fail and the proceeding code execution takes a long time (not the case here)
con.Open();
int o = sc.ExecuteNonQuery();
MessageBox.Show(o + ":Record has been inserted");
// the end of the using block will close and dispose the SqlConnection
// best practice - end the using block as soon as possible to release the database connection
}
}使用ADO.NET的最佳实践概述
System.configuration的程序集引用。
发布于 2016-07-25 18:23:11
应该在SQL命令对象上使用create参数方法。
将SQL命令中的字符串更改为
"Insert into employee values (@Employee1,@Employee2,@Employee3,@Employee4,@Employee5);"
然后在执行查询之前添加以下参数:
sc.Parameters.AddRange(new[]{
new SqlParameter("@Employee1",SqlDbType.VarChar,255){ Value= textBox1.Text},
new SqlParameter("@Employee2",SqlDbType.VarChar,255){ Value= textBox2.Text},
new SqlParameter("@Employee3",SqlDbType.VarChar,255){ Value= textBox3.Text},
new SqlParameter("@Employee4",SqlDbType.VarChar,255){ Value= textBox4.Text},
new SqlParameter("@Employee5",SqlDbType.VarChar,255){ Value= textBox5.Text}
});注意: --这是假设您的VARCHAR变量的类型为VARCHAR,大小为255,有关所使用的方法和正在使用的SqlParameter构造函数的更多信息,请参阅MSDN以获得更多文档。
发布于 2016-07-25 18:30:09
参数化查询用于避免sql注入。直接包含非参数(数据)的查询称为参数化查询。通过使用它,我们可以避免sql注入(一种类型的黑客攻击)。
c#中的参数化查询示例
string strQuery;
SqlCommand cmd;
strQuery = "insert into customers (CustomerID, CompanyName) values(@CustomerID, @CompanyName)";
cmd = new SqlCommand(strQuery);
cmd.Parameters.AddWithValue("@CustomerID", "A234");
cmd.Parameters.AddWithValue("@CompanyName", "DCB");
String strConnString = system.Configuration.ConfigurationManager.ConnectionStrings["conString"].ConnectionString;
SqlConnection con = new SqlConnection(strConnString);
cmd.CommandType = CommandType.Text;
cmd.Connection = con;
try
{
con.Open();
cmd.ExecuteNonQuery();
return true;
}
catch (Exception ex)
{
Response.Write(ex.Message);
return false;
}
finally
{
con.Close();
con.Dispose();
}。。
类似地,您也可以使用select查询。
有关参考资料,请参阅此链接
https://stackoverflow.com/questions/38574826
复制相似问题