C# 连接到Access数据库

C# 连接到Access数据库,c#,database,ms-access,C#,Database,Ms Access,我正在尝试连接到数据库文件“crepeDB.accdb” 当我通过数据连接添加它时,当我拖动任何表以任何形式显示为数据网格时,都可以正常工作,但当我尝试连接到数据库以插入数据时,会出现以下错误: 附加信息中出现“System.NotImplementedException”类型的未处理异常:未实现该方法或操作 我使用的代码如下所示: System.Data.OleDb.OleDbConnection conn = new System.Data.OleDb.OleDbConnection();

我正在尝试连接到数据库文件“crepeDB.accdb”

当我通过数据连接添加它时,当我拖动任何表以任何形式显示为数据网格时,都可以正常工作,但当我尝试连接到数据库以插入数据时,会出现以下错误:

附加信息中出现“System.NotImplementedException”类型的未处理异常:未实现该方法或操作

我使用的代码如下所示:

System.Data.OleDb.OleDbConnection conn = new System.Data.OleDb.OleDbConnection();
// TODO: Modify the connection string and include any
// additional required properties for your database.
conn.ConnectionString = (@"Provider=Microsoft.ACE.OLEDB.12.0;Data source=|DataDirectory|\\crepeDB.accdb;");

conn.Open();
string query = "insert into Sales (Sdate,SQuantity) values ('" + dateTimePicker1.Value + "','" + textBox9.Text + "')";
OleDbCommand cmd = new OleDbCommand(query, conn);
cmd.ExecuteNonQuery();

这是我在项目中需要做的最后一件事,非常感谢您的帮助。

不要为字段传递值,将它们连接起来形成命令,而是使用参数

int quantity;
if(!Int32.TryParse(textBox9.Text, out quantity))
     MessageBox.Show("Invalid number");
else
{
    using(OleDbConnection conn = new OleDbConnection(@"Provider=Microsoft.ACE.OLEDB.12.0;Data source=|DataDirectory|\\crepeDB.accdb;"))
    {    
        conn.Open();
        string query = @"insert into Sales (Sdate,SQuantity) 
                         values (@date, @qta)";
        OleDbCommand cmd = new OleDbCommand(query, conn);
        cmd.Parameters.Add("@date", OleDbType.Date).Value =  dateTimePicker1.Value;
        cmd.Parameters.Add("@qta", OleDbType.Integer).Value = quantity;
        cmd.ExecuteNonQuery();
    }
}
这更好,因为您不需要要求其他人将您的值从字符串转换为正确的数据类型。众所周知,当传递的字符串与数据库引擎如何解释该字符串之间存在某种不匹配时,这种自动转换(尤其是日期转换)会导致问题


注意:在MS Access中,我假设Sdate是DateTime类型的字段,而SQuantity是Integer类型的字段。如果没有,则可以将OleDbType Int32.TryParse更改为正确的匹配类型

不要为字段传递值,将它们连接起来以形成命令,而是使用参数

int quantity;
if(!Int32.TryParse(textBox9.Text, out quantity))
     MessageBox.Show("Invalid number");
else
{
    using(OleDbConnection conn = new OleDbConnection(@"Provider=Microsoft.ACE.OLEDB.12.0;Data source=|DataDirectory|\\crepeDB.accdb;"))
    {    
        conn.Open();
        string query = @"insert into Sales (Sdate,SQuantity) 
                         values (@date, @qta)";
        OleDbCommand cmd = new OleDbCommand(query, conn);
        cmd.Parameters.Add("@date", OleDbType.Date).Value =  dateTimePicker1.Value;
        cmd.Parameters.Add("@qta", OleDbType.Integer).Value = quantity;
        cmd.ExecuteNonQuery();
    }
}
这更好,因为您不需要要求其他人将您的值从字符串转换为正确的数据类型。众所周知,当传递的字符串与数据库引擎如何解释该字符串之间存在某种不匹配时,这种自动转换(尤其是日期转换)会导致问题


注意:在MS Access中,我假设Sdate是DateTime类型的字段,而SQuantity是Integer类型的字段。如果没有,则可以将OleDbType Int32.TryParse更改为正确的匹配类型

基本上是这样的

con.Open();
SqlCommand cmd = new SqlCommand(@"insert into tbl_insert values(@name,@email,@add)", con);
cmd.Parameters.AddWithValue("@name", txtname.Text);
cmd.Parameters.AddWithValue("@email", txtemail.Text);
cmd.Parameters.AddWithValue("@add", txtadd.Text);
cmd.ExecuteNonQuery();
con.Close();

基本上是这样的

con.Open();
SqlCommand cmd = new SqlCommand(@"insert into tbl_insert values(@name,@email,@add)", con);
cmd.Parameters.AddWithValue("@name", txtname.Text);
cmd.Parameters.AddWithValue("@email", txtemail.Text);
cmd.Parameters.AddWithValue("@add", txtadd.Text);
cmd.ExecuteNonQuery();
con.Close();


在哪条线上?异常对话框中显示的堆栈跟踪是什么?(当您当前遭受SQL注入漏洞时,应重写该对话框以使用参数化插入。)是的,让我们添加
”;删除数据库;从sys_表中选择*,其中“a”=('a
文本框9:d中的'a虽然使用参数的概念总是正确的,但由于缺少批更新功能,这种Sql注入无法与ms access一起工作。这是异常详细信息System.NotImplementedException was unhandled消息:中发生了类型为'System.NotImplementedException'的未处理异常CrepeCity.exe其他信息:未实现该方法或操作。在哪一行?异常对话框中显示的堆栈跟踪是什么?(应重写以使用参数化插入,因为当前存在SQL注入漏洞。)是的,让我们添加
”;删除数据库;从sys_表中选择*,其中“a”=('a
文本框9:d中的'a虽然使用参数的概念总是正确的,但由于缺少批更新功能,这种Sql注入无法与ms access一起工作。这是异常详细信息System.NotImplementedException was unhandled消息:中发生了类型为'System.NotImplementedException'的未处理异常Crespecity.exe其他信息:未实现该方法或操作。感谢Steve,我使用了您的代码,但它在OleDbConnection和Add上给了我红色下划线,并提示“using语句中使用的类型必须隐式转换为System.IDisposable”,在Add上给了“object不包含Add的定义”嗯,当你试图启动程序时会出现什么错误(我指的是编译器错误)严重性代码说明项目文件行抑制状态错误CS1674'OleDbConnection':using语句中使用的类型必须隐式转换为“System.IDisposable”crespecity C:\Users\Lymph47u5\Documents\Visual Studio 2015\Projects\crespecity\crespecity\frmCashier.cs 1648 ActiveSeverity代码说明项目文件行抑制tate错误CS1061“object”不包含“Add”的定义,并且找不到接受“object”类型的第一个参数的扩展方法“Add”(是否缺少using指令或程序集引用?)crespecity C:\Users\Lymph47u5\Documents\visualstudio 2015\Projects\crespecity\crespecity\frmCashier.cs 1655 active这很奇怪。代码中似乎有一个名为OleDbConnection的类隐藏了System.Data.OleDb one。请尝试在OleDbConnection之前添加完整的命名空间规范,如System.Data.OleDb.OleDbConnection,但这是错误的一个需要解决的问题。谢谢Steve,我使用了你的代码,但它在OleDbConnection和Add上给我红色下划线,提示“using语句中使用的类型必须隐式转换为System.IDisposable”,在Add上给“object不包含Add的定义”嗯,那么在尝试启动程序时会出现什么错误(我指的是编译器错误)严重性代码说明项目文件行抑制状态错误CS1674'OleDbConnection':using语句中使用的类型必须隐式转换为“System.IDisposable”crespecity C:\Users\Lymph47u5\Documents\Visual Studio 2015\Projects\crespecity\crespecity\frmCashier.cs 1648 ActiveSeverity代码说明项目文件行抑制tate错误CS1061“object”不包含“Add”的定义,并且找不到接受“object”类型的第一个参数的扩展方法“Add”(是否缺少using指令或程序集引用?)crespecity C:\Users\Lymph47u5\Documents\visualstudio 2015\Projects\crespecity\crespecity\frmCashier.cs 1655 active这很奇怪。代码中似乎有一个名为OleDbConnection的类隐藏了System.Data.OleDb one。请尝试在OleDbConnection之前添加完整的命名空间规范,如System.Data.OleDb.OleDbConnection,但这是错误的一个有待解决的问题。