我是Access和保存数据的新手。我有一个日期时间字段,我在Visual Studio中使用它来制作表单并选择日期时间选择器。我不知道我哪里出错了,但我知道这是导致问题的日历选择器。我在insert to语句中遇到错误语法错误。
这是我的代码
string When = qaWhendateTimePicker.Value.ToString("HH:mm:ss.fff");
然后是我的保存查询
SQLString = "INSERT INTO QAAnswers (QuestionID,CallMonitorNumber,When) VALUES('"+QuestionID + "','" + CallMonitorNumber + "','" + When + "');";
这当然是缩短版本。但是对于我的爱,如果我拿出它保存到数据库的时间很好
我在日期/时间设置时的Access数据库。
我应该将它设置为文字吗?我会认为不,因为我不能根据日期提取查询。
提前感谢我在这里待了好几个小时。
更新
下面的评论我改变了语法。这就是我所拥有的。如果我把.value或.date它不起作用。我确信这是我做错了。我得到错误无法将参数值从datetimepicker转换为datetime。谢谢,因为我在访问中学到了很多。
ad.InsertCommand = new OleDbCommand("insert into QAAnswers ([CallMonitorNumber],[When],[ProperGreeting],[AssureHelp],[AccountVerification],[ConfirmCaller],[ProperPoliciesSolutions],[ProperPoliciesAdmin],[AppropriateTools],[TroubleshootingSteps],[ConfirmResolved],[CustomerEducation],[CSATSurvey],[ThanksCallerBrand],[ProfessionalToneAttitude],[CustomerInvolved],[CallPace],[Empathy],[PhoneEtiquette],[DiffuseEscalated],[UnacceptableCallPractice],[Notes],[ScorePotential],[ScoreActual],[FinalScore]) values (@CallMonitorNumber,@When,@ProperGreeting,@AssureHelp,@AccountVerification,@ConfirmCaller,@ProperPoliciesSolutions,@ProperPoliciesAdmin,@AppropriateTools,@TroubleshootingSteps,@ConfirmResolved,@CustomerEducation,@CSATSurvey,@ThanksCallerBrand,@ProfessionalToneAttitude,@CustomerInvolved,@CallPace,@Empathy,@PhoneEtiquette,@DiffuseEscalated,@UnacceptableCallPractice,@Notes,@ScorePotential,@ScoreActual,@FinalScore)", con);
ad.InsertCommand.Parameters.Add("@QuestionID", OleDbType.VarChar).Value = agentIDNumbertextBox.Text.ToString();
ad.InsertCommand.Parameters.Add("@CallMonitorNumber", OleDbType.VarChar).Value = qaCallMonitorNumbertextBox.Text.ToString();
ad.InsertCommand.Parameters.Add("@When", OleDbType.DBDate).Value = qaWhendateTimePicker;
更新的答案
我终于明白了。不确定这是否是最佳方式,但我只是忽略了datetimepicker。我希望我可以使用datepicker。相反,我只是通过使用此语句输入添加日期(缩短版本)注意[when]和Date()。
DateTime now = DateTime.Now;
ad.InsertCommand = new OleDbCommand("insert into QAAnswers ([CallMonitorNumber],[When]) values (@CallMonitorNumber,Date())", con);
我希望这有助于其他人。我真的不喜欢使用数据库访问,但这是我必须使用的。
我给了marc点数,因为我从未听说过参数化查询
答案 0 :(得分:1)
您应该使用参数化查询来执行插入操作,以避免SQL注入攻击!
这样的事情:
SQLString = "INSERT INTO QAAnswers (QuestionID, CallMonitorNumber, When) VALUES(?, ?, ?);";
然后在准备insert语句时,需要添加三个参数(在Access中通常定义为p1
,p2
,p3
)并为这些参数赋值。
using (OleDbConnection conn = new OleDbConnection(YourConnectionStringHere))
using (OleDbCommand cmd = new OleDbCommand(SQLString, conn))
{
cmd.CommandType = CommandType.Text;
cmd.Parameters.Add("p1", OleDbType.VarChar, 50).Value = QuestionID;
cmd.Parameters.Add("p2", OleDbType.VarChar, 50).Value = CallMonitorNumber;
cmd.Parameters.Add("p3", OleDbType.DBDate).Value = When;
conn.Open();
cmd.ExecuteNonQuery();
conn.Close();
}
这也将避免以字符串格式避免日期问题,以及单引号和所有那些混乱事物的问题。
答案 1 :(得分:0)
您也可以使用此方法: - 在存储过程中编写插入查询(或者可以直接使用查询),然后在方法中调用它
string strcon = ConfigurationManager.ConnectionStrings["YourConnectionStringName"].ConnectionString;
con.ConnectionString = strcon;
con.Open();
SqlCommand cmd = new SqlCommand("[Your_StoredProcedureName]", con);
SqlDataAdapter da = new SqlDataAdapter(cmd);
da.SelectCommand.CommandType = CommandType.StoredProcedure;
da.SelectCommand.Parameters.AddWithValue("@value1", value1);
da.SelectCommand.Parameters.AddWithValue("@value2", value2);
da.SelectCommand.Parameters.AddWithValue("@value3", value3);
int result = da.SelectCommand.ExecuteNonQuery();
return result ;
答案 2 :(得分:0)
我终于明白了。不确定这是否是最佳方式,但我只是忽略了datetimepicker。我希望我可以使用datepicker。相反,我只是通过使用此语句输入添加日期(缩短版本)注意[when]和Date()。
DateTime now = DateTime.Now;
ad.InsertCommand = new OleDbCommand("insert into QAAnswers ([CallMonitorNumber],[When]) values (@CallMonitorNumber,Date())", con);