【问题标题】:inserting textbox values into database将文本框值插入数据库
【发布时间】:2011-05-05 12:55:22
【问题描述】:

我是这里的新手,想要一些关于 C# 编程的建议

我想将文本框中的值存储到数据库中。 到目前为止,我有以下内容:

string connectionString = @"Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirectory|\Customers.mdf;Integrated Security=True;User Instance=True";
SqlConnection connection = new SqlConnection(connectionString);
connection.Open();

string query = "INSERT INTO ProjectList (ProjectName, BiddingDueDate, Status, ProjectStartDate, ProjectEndDate, AssignedTo, PointsWorth, StaffCredits) VALUES ('"+projName+"', '"+bidDueDate+"', '"+status+"', '"+projectStartDate+"', '"+projectEndDate+"', '"+assignedTo+"', '"+pointsWorth+"', '"+aStaffCredits+"')";
SqlCommand command = new SqlCommand(query, connection);

command.ExecuteNonQuery();
connection.Close();

代码中没有错误,但我似乎无法弄清楚为什么数据库中没有存储任何内容。

【问题讨论】:

  • 您使用的变量是文本框名称还是字符串值?

标签: c# sql sql-server tsql ado.net


【解决方案1】:

首先,您的代码对于SQL Injection attacks 来说已经成熟——您确实应该使用参数化查询。

另外,如果你使用参数,你可以有一些类型安全,并且值将被正确地转换为 SQL Server。

很难判断这里出了什么问题,因为我们不知道您要连接的值(例如,bidDueDate 是什么样的?,thisQuery 在您执行之前是什么样的?)。

我通常会把它写成一个存储过程,获取插入记录所需的参数,在我的 C# 中,我会创建命令对象,向它添加正确的参数(和类型)。

请参阅this MSDN 页面 (SqlCommand.Parameters) 上的示例。

【讨论】:

  • +1 用于我的 sql 注入。由于 jill 声称自己是新手,我认为新开发人员最好从真正的早期阶段了解安全性。
  • @Conspicuous Compiler - 如果你提到 Bobby,至少提供一个link...
【解决方案2】:

至少你的代码应该是这样的:

void SaveData(string projectName, DateTime biddingDueDate, string status, DateTime projectStartDate, string assignedTo, int pointsWorth, string staffCredits)
{
    try
    {
        string connectionString = @"Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirectory|\Customers.mdf;Integrated Security=True;User Instance=True";
        using (SqlConnection connection = new SqlConnection(connectionString))
        using (SqlCommand command = connection.CreateCommand())
        {
            command.CommandText = "INSERT INTO ProjectList (ProjectName, BiddingDueDate, Status, ProjectStartDate, ProjectEndDate, AssignedTo, PointsWorth, StaffCredits) VALUES (@projectName, @biddingDueDate, @status, @projectStartDate, @projectStartDate, @assignedTo, @pointsWorth, @staffCredits)";

            command.Parameters.AddWithValue("@projectName", projectName);
            command.Parameters.AddWithValue("@biddingDueDate", biddingDueDate);
            command.Parameters.AddWithValue("@status", status);
            command.Parameters.AddWithValue("@projectStartDate", projectStartDate);
            command.Parameters.AddWithValue("@assignedTo", assignedTo);
            command.Parameters.AddWithValue("@pointsWorth", pointsWorth);
            command.Parameters.AddWithValue("@staffCredits", staffCredits);

            connection.Open();
            command.ExecuteNonQuery();
        }
    }
    catch (SqlException ex)
    {
        Console.WriteLine(ex.Message);
    }

}

参数的类型可以自动确定(尝试):

command.Parameters.AddWithValue("@biddingDueDate", biddingDueDate);

或手动指定:

command.Parameters.Add("@biddingDueDate", System.Data.SqlDbType.DateTime).Value = biddingDueDate;

您还可以将日期转换为具有指定格式的字符串,以最大程度地减少数据库端错误解析的风险(由于文化相关的特异性等):

command.Parameters.Add("@biddingDueDate", System.Data.SqlDbType.DateTime).Value = biddingDueDate.ToString("yyyy-MM-dd"); // also you can use just yyyyMMdd

【讨论】:

  • 感谢您向我展示代码的外观!另一个问题是: command.Parameters.AddWithValue("@biddingDueDate", biddingDueDate);仅当 bidDueDate 是字符串时?
  • @jill:顺便说一句,您可以使用波浪线在 cmets 中突出显示语法:var hello = "world!";
【解决方案3】:

如果示例中的变量是TextBox,它应该写成projName.Text,status.Text。

【讨论】:

    【解决方案4】:

    您是否将数据库文件的“复制到输出目录”属性设置为“始终复制”?

    因为这会在您每次构建时覆盖您的数据库文件。

    【讨论】:

      【解决方案5】:

      如果您的 ProjectStartDate 和日期通常是数据库中的日期时间值,那么在插入带有 '. 应该是这样的:

      String thisQuery = "INSERT INTO ProjectList (ProjectName, BiddingDueDate, Status, ProjectStartDate, ProjectEndDate, AssignedTo, PointsWorth, StaffCredits) VALUES ('"+projName+"', "+bidDueDate+", '"+status+"', "+projectStartDate+", "+projectEndDate+", '"+assignedTo+"', '"+pointsWorth+"', '"+aStaffCredits+"')"; 
      

      【讨论】:

      • 始终使用 sql 参数,也就是参数化查询
      • 我知道...但这只是为了帮助他解决他的问题:)
      【解决方案6】:

      你要做的第一件事就是找出问题所在

      Console.WriteLine(thisQuery);
      

      StringthisQuery=这一行之后

      这将准确地向您显示您调用 Db 的语句,并且仅通过查看输出就可以清楚地知道该语句有什么问题。

      【讨论】:

        猜你喜欢
        • 2015-03-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-03-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-01-20
        相关资源
        最近更新 更多