我目前在将dateTime值插入数据库时遇到问题。首先,我从visual studio 2010中的日历控件中选择一个日期。然后我将日期格式化为dd / M / yyyy格式。这是代码:
protected void calendar_selectionChanged(object sender, EventArgs e)
{
tb_date.Text = calendar.SelectedDate.ToString("dd/M/yyyy", CultureInfo.InvariantCulture);
calendar.Visible = false;
}
之后,我将用户输入传递给businessLogicLayer:
PackingBLL packing = new PackingBLL();
string msg = "";
msg = packing.createSession(tb_location.Text, tb_date.Text, tb_volunteerNeeded.Text);
lbl_msg.Text = msg;
在我的业务逻辑层中:
public string createSession(string location, string dateStr, string volunteerNeededStr)
{
string returnMessage = "";
if (returnMessage.Length == 0)
{
DateTime date = DateTime.ParseExact(dateStr, "dd/M/yyyy", CultureInfo.InvariantCulture);
int volunteerNeeded = int.Parse(volunteerNeededStr);
Packing packing = new Packing(location, date, volunteerNeeded);
int nofRows = 0;
nofRows = packing.PackingInsert();
if (nofRows > 0)
returnMessage = "Packing session record saved successfully.";
else
returnMessage = "Error! Please try again.";
}
return returnMessage;
}
然后从那里,我将它们传递到数据访问层以执行Sql语句:
public static int executeNonQuery(string query)
{
int result = 0;
System.Diagnostics.Debug.WriteLine("FFTHDb executeNonQuery: " + query);
SqlConnection connection = new SqlConnection(connectionString);
SqlCommand command = new SqlCommand(query, connection);
connection.Open();
result = command.ExecuteNonQuery();
connection.Close();
return result;
}
private DateTime _date;
public DateTime date
{
get { return _date; }
set { _date = value; }
}
public int PackingInsert()
{
int nofRows = 0;
nofRows = FFTHDb.executeNonQuery("INSERT INTO PackingSession (packingDate, packingLocation, volunteerNeeded) " +
" VALUES ('" + date + "' , '" + location + "' , " + volunteerNeeded + "");
return nofRows;
}
但是,当我尝试插入数据时,它会一直提示我第10行的语法错误。但是我不知道Sql语句出了什么问题。
答案 0 :(得分:4)
语法错误是查询中缺少右括号。 VALUES
语句缺少右括号。
另一个可能的问题是查询中日期的格式。当您将DateTime
值连接到查询中时,ToString
方法将用于将其转换为字符串,这意味着它将使用当前文化(无论可能是什么)来执行转换。这可能不是数据库识别的日期格式,也可能是错误解释(例如mm/dd/yyyy
而不是dd/mm/yyyy
)。
您应该使用参数化查询,以便将参数作为数据类型发送,而不是将它们连接到查询中。
附注:您应该处置正在使用的连接和命令对象。 using
关键字对此有用。
示例:
string query =
"INSERT INTO PackingSession (packingDate, packingLocation, volunteerNeeded) " +
"VALUES (@Date, @Location, @VolunteerNeeded)";
using (SqlConnection connection = new SqlConnection(connectionString)) {
using (SqlCommand command = new SqlCommand(query, connection)) {
command.Parameters.AddWithValue("@Date", date);
command.Parameters.AddWithValue("@Location", location);
command.Parameters.AddWithValue("@VolunteerNeeded", volunteerNeeded);
connection.Open();
result = command.ExecuteNonQuery();
connection.Close();
}
}