参数化查询我是VisualC#的新手,对如何编写参数化查询感到困惑。这是没有它们的代码,使用系统;使用System.Windows.Forms;使用System.Data.SqlClient;namespaceInsert_Data{publicpartialclassForm1:Form{privatevoidbutton1_Click(objectsender,EventArgse){SqlConnectioncon=newSqlConnection("DataSource=ZTABASSUM\SQLEXPRESS01;InitialCatalog=IntroDataBase;IntegratedSecurity=True");con.Open();SqlCommandsc=newSqlCommand("插入员工值('"+textBox1.Text+"',"+textBox2.Text+",'"+textBox3.Text+"',"+textBox4.Text+","+textBox5.Text+");,con);into=sc。执行非查询();消息框。Show(o+":记录已插入");con.Close();我不确定如何为每个文本框编写参数化查询。我在代码中添加了注释以及之后的最佳实践。//最佳实践-使用有意义的方法名称privatevoidbuttonSaveEmployee_Click(objectsender,EventArgse){//最佳实践-将所有数据库连接包装在一个using块中,以便即使在发生异常时它们也始终关闭并处置//最佳实践-从app.config或web.config(取决于应用程序类型)按名称检索连接字符串(注意,这需要对System.configuration的程序集引用)using(SqlConnectioncon=newSqlConnection(System.Configuration.ConfigurationManager).ConnectionStrings["MyConnectionName"].ConnectionString)){//最佳实践-在INSERT语句中使用列名,这样你就不会依赖于sql模式列顺序//最佳实践-始终使用参数来避免sql注入攻击和错误如果使用了格式错误的文本,比如包含一个单引号,这在sql中相当于转义或开始一个字符串(varchar/nvarchar)//最佳实践-给出你的参数有意义的名字就像你在代码中做变量一样",反对);//最佳实践-始终指定您正在使用的列的数据库数据类型//最佳实践-检查代码中的有效值和/或使用数据库约束,如果插入NULL,则使用System.DbNull.Valuesc.Parameters.Add(newSqlParameter("@firstName",SqlDbType.VarChar,200){Value=string.IsNullOrEmpty(textBoxFirstName.Text)?(object)System.DBNull.Value:(object)textBoxFirstName.Text});sc.Parameters.Add(newSqlParameter("@lastName",SqlDbType.VarChar,200){Value=string.IsNullOrEmpty(textBoxLastName.Text)?(object)System.DBNull.Value:(object)textBoxLastName.Text});//最佳实践-在指定参数时始终使用正确的类型,在这种情况下,字符串会转换为DateTim在分配给SqlParameter.Value之前的e类型//注意-这不是一个非常可靠的解析日期的方法,因为在失败的情况下永远不会通知用户,这里的目的只是为了展示如何使用各种参数类型DateTimedob;sc.Parameters.Add(newSqlParameter("@dateOfBirth",SqlDbType.Date){Value=DateTime.TryParse(textBoxDateOfBirth.Text,outdob)?(object)dob:(object)System.DBNull.Value});//最佳实践-尽可能晚地打开你的连接,除非你需要验证数据库连接是否有效并且不会失败并且后续代码执行需要很长时间(这里不是这种情况)con.Open();into=sc.ExecuteNonQuery();MessageBox.Show(o+":记录已插入");//using块的末尾将关闭并处理SqlConnection//最佳实践-尽快结束using块以释放数据库连接}}使用ADO.NET的最佳实践回顾开始最终使用传入值的参数使用参数时使用数据库连接时您应该在SQL命在对象上使用创建参数方法将SQL命令中的字符串改为“Insertintoemployeevalues(@Employee1,@Employee2,@Employee3,@Employee4,@Employee5);”然后在执行查询之前添加参数:sc.Parameters.AddRange(new[]{newSqlParameter("@Employee1",SqlDbType.VarChar,255){Value=textBox1.Text},newSqlParameter("@Employee2",SqlDbType.VarChar,255){Value=textBox2.Text},newSqlParameter("@Employee3",SqlDbType.VarChar,255){Value=textBox3.Text},newSqlParameter("@Employee4",SqlDbType.VarChar,255){Value=textBox4.Text},newSqlParameter("@Employee5",SqlDbType.VarChar,255){Value=textBox5.Text}});注意:这里假定您的SQL变量的类型为VARCHAR,大小为255,关于所使用的方法和所使用的SqlParameter构造函数。有关详细信息,请查看MSDN以获取有关避免sql注入的参数化查询的更多文档。直接包含非参数(数据)的查询称为参数化查询。通过使用它,我们可以避免SQL注入(一种hack)。c#stringstrQuery中参数化查询的例子;SqlCommand命令;strQuery="插入客户(CustomerID,CompanyName)值(@CustomerID,@CompanyName)";cmd=newSqlCommand(strQuery);cmd.Parameters.AddWithValue("@CustomerID","A234");cmd.Parameters.AddWithValue("@CompanyName","DCB");字符串strConnString=system.Configuration.ConfigurationManager.ConnectionStrings["conString"].ConnectionString;SqlConnectioncon=newSqlConnection(strConnString);cmd.CommandType=CommandType.Text;cmd.Connection=con;尝试{con.Open();cmd.ExecuteNonQuery();返回真;}catch(Exceptionex){Response.Write(ex.Message);返回假;}最后{con.Close();con.Dispose();}..同样可以用于选择查询..供参考,如果您有数据库上下文,请参阅此链接,您可以这样做:introwsAffected=context.ExecuteStoreCommand("插入员工值({0},{1},{2},{3},{4})",textBox1.Text,textBox2.Text,textBox3.Text,textBox4.Text,textBox5.文本);消息框。Show(rowsAffected+":记录已插入ed");cfhttps://msdn.microsoft.com/en-us/library/ee358769%28v=vs.100%29.aspx请停止使用AddWithValue因为它推断数据库类型(坏),在我看来不是干净的代码这里有一些简单的代码可以让你开始。",OracleDbType.Int32).Value=person.PersonID;command.Parameters.Add("REFCURSOR",OracleDbType.RefCursor).Direction=ParameterDirection.Output;别管是Oracle,同样的道理用在SQL上面就是全部C#学习教程:参数化查询分享内容,如果对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场.如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
