将文本框值插入数据库

时间:2010-11-05 10:27:27

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

我是这里的新手,想要一些关于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();

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

6 个答案:

答案 0 :(得分:11)

首先,您的代码适用于SQL Injection attacks - 您确实应该使用参数化查询。

此外,如果您使用参数,您可以具有某些类型安全性,并且值将正确转换为SQL Server。

很难说出这里有什么问题,因为你连接的值对我们来说是未知的(例如,bidDueDate看起来是什么样的?thisQuery在执行之前是什么样的?吗?)。

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

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

答案 1 :(得分:7)

至少你的代码应如下所示:

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

答案 2 :(得分:0)

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

答案 3 :(得分:0)

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

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

答案 4 :(得分:0)

你要做的第一件事是找出出错的地方

Console.WriteLine(thisQuery);
在行StringthisQuery=

之后

这将向您显示您正在调用Db的语句,并且通过查看输出语句的错误可能很清楚。

答案 5 :(得分:-1)

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

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