INSERT查询 - MSACCESS表不工作的DateTime参数(ASP.NET)

时间:2016-02-18 16:07:57

标签: sql asp.net vb.net ms-access

上下文:

我使用代码文件为我的ASP.NET Web表单编写所有VB.NET。我的.aspx正在尝试使用表单中的用户输入在我的MSACCESS数据库表中创建记录。我的组织没有购买Visual Studio,因此我在NotePad ++中完成所有工作,并且没有真正的调试功能。

问题:

其中一个输入文本框要求提供日期,其预期输入将被验证为遵循" M / d / yyyy"。

每当我尝试修改或调整我的代码以使其工作时,我总是会出现相同的错误:" System.FormatException:字符串未被识别为有效的DateTime。 "

任何帮助都会非常赞赏!!

有问题的部分:

我应该注意,我在此代码中发现的任何问题也适用于我用于收集“截止日期”的其他日期字段,您可能会在“完整代码”部分中看到这一点。

    Dim prmAdded as OleDbParameter = New OleDbParameter("@DateAdded",OleDbType.DBDate)
    dt = DateTime.ParseExact(newDateAdded.value,"M/d/yyyy", provider)
    prmAdded.Value = dt
    cmd.Parameters.Add(prmAdded)

注意:

  • 我将Date对象从ParseExact分解为它自己的变量, ' dt'而不是直接放入' prmAdded.value'用于调试 目的。
  • 我尝试了其他几个产生同样错误的OleDbtypes。
  • 我在这里查看了其他类似的帖子并尝试了这些解决方案,但我仍然遇到同样的错误。

完整代码:

    Protected Sub AddTask_Click(ByVal sender As Object, ByVal e As EventArgs)

    con.Open()
    Dim strSQL as string, dt as DateTime, provider as CultureInfo = CultureInfo.InvariantCulture

    strSQL = "INSERT INTO Tasks(Task, DateAdded, DateDue)" _
    & "VALUES (@Task,@DateAdded,@DateDue)"

    Dim cmd As New OleDbCommand(strSQL, con)

    cmd.Parameters.Clear()
    cmd.Parameters.AddWithValue("@Task", newTask.value)

    Dim prmAdded as OleDbParameter = New OleDbParameter("@DateAdded",OleDbType.DBDate)
    dt = DateTime.ParseExact(newDateAdded.value,"M/d/yyyy", provider)
    prmAdded.Value = dt
    cmd.Parameters.Add(prmAdded)

    Dim prmDue as OleDbParameter = New OleDbParameter("@DateDue",OleDbType.Date)
    dt = DateTime.ParseExact(newDueDate.value,"M/d/yyyy", provider)
    prmDue.Value = dt
    cmd.Parameters.Add(prmDue)

    cmd.ExecuteNonQuery() 
    con.Close() 

1 个答案:

答案 0 :(得分:0)

我无法重现您的问题,但我制作的样本可能可以帮助您找到问题所在。在您的帖子中不清楚您正在使用什么数据提供程序以及Task,DateAdded和DateDue的输入值是什么。

使用您的代码作为起点,我创建了一个Microsoft Access数据库,其Tasks表定义如下:

enter image description here

TaskDateAddedDateDue也都设置为Required

我的代码如下:

class Program
{
    static void Main(string[] args)
    {
        var task = new Task();
        task.AddTask("First One", "02/18/2016", "02/21/2016");
    }
}

internal class Task
{
    private OleDbConnection _conn;

    public Task()
    {
        _conn = new OleDbConnection(@"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=D:\Temp\AccessSample\AccessSample\AppData\Database.accdb;");
    }

    public bool AddTask(string task, string dateAdded, string dateDue)
    {
        _conn.Open();
        string strSQL = "INSERT INTO Tasks(Task, DateAdded, DateDue) VALUES (@Task,@DateAdded,@DateDue)";

        using (OleDbCommand cmd = new OleDbCommand(strSQL, _conn))
        {
            cmd.Parameters.AddWithValue("@Task", task);

            var dateAddedParam = new OleDbParameter("@DateAdded", OleDbType.DBDate);
            var dt = DateTime.ParseExact(dateAdded, "M/d/yyyy", System.Globalization.CultureInfo.InvariantCulture);
            dateAddedParam.Value = dt;
            cmd.Parameters.Add(dateAddedParam);

            var dateDueParam = new OleDbParameter("@DateDue", OleDbType.DBDate);
            dt = DateTime.ParseExact(dateDue, "M/d/yyyy", System.Globalization.CultureInfo.InvariantCulture);
            dateDueParam.Value = dt;
            cmd.Parameters.Add(dateDueParam);

            cmd.ExecuteNonQuery();
        }

        _conn.Close();
        return true;
    }
}

注意:我使用的是32位Provider = Microsoft.ACE.OLEDB.12.0,这意味着控制台应用程序设置为编译为x86。