gpt4 book ai didi

c# - 这个简单的更新查询有什么问题?

转载 作者:行者123 更新时间:2023-11-30 18:55:44 24 4
gpt4 key购买 nike

除了不安全...我没有收到任何错误消息,但该行未更新。行整数在查询后设置为 1,表示有 1 行受到影响。

String query = "UPDATE contacts SET contact_name = '" + ContactName.Text.Trim() + "', " +
"contact_phone = '" + Phone.Text.Trim() + "', " +
"contact_fax = '" + Fax.Text.Trim() + "', " +
"contact_direct = '" + Direct.Text.Trim() + "', " +
"company_id = '" + Company.SelectedValue + "', " +
"contact_address1 = '" + Address1.Text.Trim() + "', " +
"contact_address2 = '" + Address2.Text.Trim() + "', " +
"contact_city = '" + City.Text.Trim() + "', " +
"contact_state = '" + State.SelectedValue + "', " +
"contact_zip = '" + Zip.Text.Trim() + "' " +
"WHERE contact_id = '" + contact_id + "'";

String cs = Lib.GetConnectionString(null);
SqlConnection conn = new SqlConnection(cs);

SqlCommand cmd = conn.CreateCommand();
cmd.CommandText = query;
cmd.Connection.Open();
int rows = cmd.ExecuteNonQuery();

最佳答案

出于以下几个原因,您应该使用参数化查询:

  • 消除嵌入式 apos 破坏您的查询的可能性
  • 保护您的数据库/网站免受 sql 注入(inject)攻击

此外,如果 cmd 返回 1,则该行已更新。您可能需要检查您的期望...

String query = @"
UPDATE contacts
SET contact_name = @contact_name, contact_phone = @contact_phone, contact_fax = @contact_fax,
contact_direct = @contact_direct , company_id = @company_id, contact_address1 = @contact_address1,
contact_address2 =@contact_address2, contact_city = @contact_city , contact_state = @contact_state,
contact_zip = @contact_zip
WHERE contact_id = @contact_id";

String cs = Lib.GetConnectionString(null);
using (SqlConnection conn = new SqlConnection(cs))
{
using (SqlCommand cmd = conn.CreateCommand())
{
cmd.Parameters.AddWithValue("@contact_name", ContactName.Text.Trim());
cmd.Parameters.AddWithValue("@contact_phone", Phone.Text.Trim());
cmd.Parameters.AddWithValue("@contact_fax", Fax.Text.Trim());
cmd.Parameters.AddWithValue("@contact_direct", Direct.Text.Trim());
cmd.Parameters.AddWithValue("@company_id", Company.SelectedValue);
cmd.Parameters.AddWithValue("@contact_address1", Address1.Text.Trim());
cmd.Parameters.AddWithValue("@contact_address2", Address2.Text.Trim());
cmd.Parameters.AddWithValue("@contact_city", City.Text.Trim());
cmd.Parameters.AddWithValue("@contact_state", State.SelectedValue);
cmd.Parameters.AddWithValue("@contact_zip", Zip.Text.Trim());
cmd.Parameters.AddWithValue("@contact_id", contact_id);
cmd.CommandText = query;
cmd.Connection.Open();
int rows = cmd.ExecuteNonQuery();
}
}

现在,这看起来是不是更干净了?当你明白为什么,它会给你一种温暖的模糊感觉,让你晚上睡个好觉。 ;-)

澄清:

您提出的问题是“此查询有什么问题”。答案是什么。查询没有问题。

问题出在您的页面代码上,即使在 5 个人建议查询没有问题之后您也没有发布。

John 更清楚地描述了我所说的“您可能需要检查您的期望...”和“您需要在执行查询之前检查进入参数的数据以确保它们是您想要的”的意思,但让我再次简要指出:

显示的查询表面上是正确的,应该按预期执行。您可能遇到的是周围代码逻辑中的缺陷。

很可能您在没有 IsPostback 守卫的情况下在 page_load 中进行数据绑定(bind),从而用原始数据覆盖您的输入值。

您只需要在第一次加载时加载和绑定(bind)您的控件/页面一次。此后,控件的状态将保存在 View 状态中, View 状态存储在 html 的隐藏字段中。如果您只是在每次加载页面时绑定(bind)到数据源,您将覆盖任何输入

那么让我们来看看它是如何工作的。

这是一个正确的逻辑流程

protected void Page_Load(object sender, EventArgs e)
{
System.Diagnostics.Trace.WriteLine("Page_Load");
if (!IsPostBack)
{
System.Diagnostics.Trace.WriteLine("\tBind TextBox1");
TextBox1.Text = "Initial Value";
}
System.Diagnostics.Trace.WriteLine("\tTextBox1.Text = " + TextBox1.Text);
}

protected void Button1_Click(object sender, EventArgs e)
{
System.Diagnostics.Trace.WriteLine("Button1_Click");
System.Diagnostics.Trace.WriteLine("\tTextBox1.Text = " + TextBox1.Text);
}

如果加载此页面,请在文本框中输入“新值”并单击第一个按钮,这就是 Trace 显示的内容:

    Page_Load        Bind TextBox1        TextBox1.Text = Initial Value    Page_Load        TextBox1.Text = New Value    Button1_Click        TextBox1.Text = New Value

But without the guard:

protected void Page_Load(object sender, EventArgs e)
{
System.Diagnostics.Trace.WriteLine("Page_Load");
System.Diagnostics.Trace.WriteLine("\tBind TextBox1");
TextBox1.Text = "Initial Value";
System.Diagnostics.Trace.WriteLine("\tTextBox1.Text = " + TextBox1.Text);
}

protected void Button1_Click(object sender, EventArgs e)
{
System.Diagnostics.Trace.WriteLine("Button1_Click");
System.Diagnostics.Trace.WriteLine("\tTextBox1.Text = " + TextBox1.Text);
}

您会得到您可能正在经历的结果...

    Page_Load        Bind TextBox1        TextBox1.Text = Initial Value    Page_Load        Bind TextBox1        TextBox1.Text = Initial Value    Button1_Click        TextBox1.Text = Initial Value

但同样,可以帮助您的实用调试技术是在执行查询之前中断更新方法并检查值以验证它们是否如您所想,然后从那里开始。

关于c# - 这个简单的更新查询有什么问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2799136/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com