C#并将日期字段保存到MS Access数据库

时间:2014-09-16 04:32:58

标签: c# sql database winforms ms-access-2007

我是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点数,因为我从未听说过参数化查询

3 个答案:

答案 0 :(得分:1)

您应该使用参数化查询来执行插入操作,以避免SQL注入攻击!

这样的事情:

SQLString = "INSERT INTO QAAnswers (QuestionID, CallMonitorNumber, When) VALUES(?, ?, ?);";

然后在准备insert语句时,需要添加三个参数(在Access中通常定义为p1p2p3)并为这些参数赋值。

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);