如何设置在遇到"ExecuteNonQuery"错误时设置 SqlCommand 对象的连接属性?



我在这里读到了几个不应该使用AddWithValue的问题,所以我试图更改我的代码,但我得到了这个错误"'ExecuteNonQuery:连接属性尚未初始化。'"根据这里的帖子,我必须设置SqlCommand对象的Connection属性,但在我的情况下,我该怎么做?我试了几个";使用(sqlCommand…"等,似乎什么都不起作用。有什么想法吗?

protected void txtSignup_Click(object sender, EventArgs e)
{
if (isformvalid()) 
{
using (SqlConnection sqlCon = new SqlConnection(ConfigurationManager.ConnectionStrings ["MyShoppingBD"].ConnectionString))

{
sqlCon.Open();
SqlCommand sqlCmd = new SqlCommand("Insert into tblUsers(Username,Password,Name,Email,Usertype) Values('" + txtUserName.Text + "','" + txtPassw.Text + "','" + txtFullName.Text + "','" + txtEmail.Text + "', 'User' )");
sqlCmd.ExecuteNonQuery();
Clear();
sqlCon.Close();
Response.Write("<script>alert('Registration Successfully done!');</script>");
lblMsg.Visible = true;
lblMsg.Text = "Registration Successfully done";
lblMsg.ForeColor = System.Drawing.Color.Green;
}
Response.Redirect("~/SignIn.aspx");            
}        

我在web.config 中使用此代码

<connectionStrings>
<add name ="MyShoppingBD" connectionString="Data Source=.;Initial Catalog=MyEShoppingDB;Integrated Security=True" providerName="System.Data.SqlClient"/>
</connectionStrings>

您可以使用

SqlCommand cmd = sqlCon.CreateCommand();
cmd.CommandText = "...";

SqlCommand cmd = new SqlCommand("...", sqlCon);

与几乎任何关于SQL查询的问题一样,这只是一个提醒:您不应该通过字符串串联将值添加到查询中,而是使用参数化查询来防止SQL注入。当使用.ToString()向查询添加值(例如使用double值(时,这也将消除各种转换问题。

string query = "insert into tblUsers(Username,Password,Name,Email,Usertype) values (@username, @password, @email, @usertype)";
SqlCommand cmd = new SqlCommand(query, sqlCon);

var unp= new SqlParameter("@username", SqlDbType.NVarchar);
unp.Value = theUsername;
cmd.Parameters.Add(unp);
//or simpler, thanks to @Cleptus' comment
cmd.Parameters.Add("@password", SqlDbType.NVarchar).Value = thePassword;
//add other parameters accordingly
cmd.ExecuteNonQuery();

好吧,建议转储而不使用AddWithValue?好吧,这并不意味着你放弃了使用参数的概念、用途和由来已久的建议!

我建议这个代码:

string strSQL = "INSERT INTO tblUsers (Username, Password, Name, Email, UserType) " 
+ "VALUES (@UserName,@Password,@Name,@Email, @UserType)"
using (SqlCommand cmdSQL = new SqlCommand(strSQL,
new SqlConnection(ConfigurationManager.ConnectionStrings("MyShoppingBD").ConnectionString)))
{
cmdSQL.Parameters.Add("@UserName", SqlDbType.NVarChar).Value = txtUserName.Text;
cmdSQL.Parameters.Add("@Password", SqlDbType.NVarChar).Value = txtPassw.Text;
cmdSQL.Parameters.Add("@Name", SqlDbType.NVarChar).Value = txtFullName.Text;
cmdSQL.Parameters.Add("@Email", SqlDbType.NVarChar).Value = txtEmail.Text;
cmdSQL.Parameters.Add("@UserType", SqlDbType.NVarChar).Value = "User";

cmdSQL.Connection.Open();
cmdSQL.ExecuteNonQuery();
}

现在上面有一卡车的东西。

首先,当我输入参数时,我可以";参见";SQL语句。所以,我不必思考或记住parm值——它们可以在代码编辑器中看到。换句话说,我实际上不必;保持";在我的人类标记101内存缓存预取碳基内存单元!

虽然parms是更多的几行代码,但在我输入第一行后,我敲击了ctrl-d 5次。

现在,我不打字,只是编辑@符号后的文本。所以向下箭头,编辑,向下箭头编辑。这几乎就像在Excel工作表中编辑值一样。一旦你这样做了几次,你就不会再回到又长又丑的大绳子上了。

因此,尽管这给我们带来了";漂亮的";参数集?

好吧,我认为更好的是,我实际上在编辑器中键入的内容更少,但更重要的是我没有那么长的字符串concat——它真的很难读,很难写,很难维护。而且真的很容易打破或搞砸!

那么使用参数的价值是多少呢?我认为避免长字符串的价值是非常好的,而且很难处理。

如果用户输入全名,比如John O'Mally?好吧,现在你在这个字符串中有一个引号,它会很容易在你身上爆炸。

而且大多数人都忽略了这样一个事实,即sqlcmd对象既有parameters对象,也有一个连接对象。

因此,无需创建单独的连接对象-cmd对象有一个适合您的!当想要将sql传递给另一个";一般的";例程-改为传递cmd对象。连接对象和参数集合与sql字符串ALL一起使用!(三合一!!(。

所以,所有适合你的可爱的小物件!

那么,当参数是一个真正的必须做的?我认为消除单引号和双引号的长括号?-一只真正的熊。

参数更好吗?是日期、日期时间、数字还是字符串?你不必担心引用数据(或者在数字的情况下不引用(。因此,您可以毫不费力地进行强大的类型转换。

最新更新