如何通过C#将信息输入Access数据库?

如何通过C#将信息输入Access数据库?,c#,database,visual-studio,oledb,C#,Database,Visual Studio,Oledb,我正在为我的程序开发用户名/密码创建系统。它将用于计算机实验室,我将拥有一个中央Access数据库,通过实验室机器上的脚本分发。或者这就是现在的计划。不过,我记不起将信息插入数据库以拯救生命的正确代码了。这就是我到目前为止得到的。散列和盐析似乎进行得很顺利,我只是无法将其放入数据库。该表的名称为regulate 我得到的是“查询字段和目标字段的数量不一样” 此字段中的字段和类型数: INSERT INTO regulate(regulate) 必须与此匹配: Values(var1, var2

我正在为我的程序开发用户名/密码创建系统。它将用于计算机实验室,我将拥有一个中央Access数据库,通过实验室机器上的脚本分发。或者这就是现在的计划。不过,我记不起将信息插入数据库以拯救生命的正确代码了。这就是我到目前为止得到的。散列和盐析似乎进行得很顺利,我只是无法将其放入数据库。该表的名称为regulate

我得到的是“查询字段和目标字段的数量不一样”


此字段中的字段和类型数:

INSERT INTO regulate(regulate)
必须与此匹配:

Values(var1, var2, var3)
应该是这样的:

INSERT INTO regulate(name, password, salt) Values(?, ?, ?)
假设这些是列名


PS:我不经常使用OleDb,但我相信您需要
而不是按照@p.s.w.g的答案命名
@arg
。(如果有帮助,请向上投票)。我可以确认我的所有OleDb代码确实只使用了位置参数。

其中的字段和类型数量:

INSERT INTO regulate(regulate)
必须与此匹配:

Values(var1, var2, var3)
应该是这样的:

INSERT INTO regulate(name, password, salt) Values(?, ?, ?)
假设这些是列名

PS:我不经常使用OleDb,但我相信您需要
而不是按照@p.s.w.g的答案命名
@arg
。(如果有帮助,请向上投票)。我可以确认我的所有OleDb代码确实只使用了位置参数。

使用了与
SqlCommand
不同的参数格式,如文档中所示:

CommandType
设置为
Text
时,OLE DB.NET提供程序不支持将参数传递给SQL语句或由
OleDbCommand
调用的存储过程的命名参数。在这种情况下,必须使用问号(
)占位符

按照建议,检查
INSERT
命令的语法

另外,
PASSWORD
是Jet SQL中的一个名称,因此您可能需要引用该列名。我相信这两种报价方式中的任何一种都会奏效:

INSERT INTO regulate(name, `password`, salt) Values(?, ?, ?)
使用与
SqlCommand
不同的参数格式,如文档中所示:

CommandType
设置为
Text
时,OLE DB.NET提供程序不支持将参数传递给SQL语句或由
OleDbCommand
调用的存储过程的命名参数。在这种情况下,必须使用问号(
)占位符

按照建议,检查
INSERT
命令的语法

另外,
PASSWORD
是Jet SQL中的一个名称,因此您可能需要引用该列名。我相信这两种报价方式中的任何一种都会奏效:

INSERT INTO regulate(name, `password`, salt) Values(?, ?, ?)

第一件重要的事情是确保访问.mdb的路径正确。
然后还要确保,如果您向insert语句提供了3个参数(在您的情况下,
@NAME
@PASSWORD
@SALT
),则还必须为这3个参数分配一个匹配的列

string cs = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=access.mdb";
OleDbConnection c = new OleDbConnection(cs);

string Name = txtName.Text;
string PW = txtHash.Text;
string Salt = txtSalt.Text;

try
{
    c.Open();

    string s = "INSERT INTO regulate(NAME, PASSWORD, SALT) Values (@NAME, @PASSWORD, @SALT)";
    using (OleDbCommand cmd = new OleDbCommand(s, c))
    {
        cmd.Parameters.AddWithValue("@NAME", Name);
        cmd.Parameters.AddWithValue("@PASSWORD", PW);
        cmd.Parameters.AddWithValue("@SALT", Salt);
        cmd.ExecuteNonQuery();
        MessageBox.Show("DATA ADDED");
    }
}
catch (OleDbException ex)
{
    MessageBox.Show(ex.Message);
}
catch (Exception ex)
{
    MessageBox.Show(ex.Message);
}
finally
{
    c.Close();
}

第一件重要的事情是确保访问.mdb的路径正确。
然后还要确保,如果您向insert语句提供了3个参数(在您的情况下,
@NAME
@PASSWORD
@SALT
),则还必须为这3个参数分配一个匹配的列

string cs = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=access.mdb";
OleDbConnection c = new OleDbConnection(cs);

string Name = txtName.Text;
string PW = txtHash.Text;
string Salt = txtSalt.Text;

try
{
    c.Open();

    string s = "INSERT INTO regulate(NAME, PASSWORD, SALT) Values (@NAME, @PASSWORD, @SALT)";
    using (OleDbCommand cmd = new OleDbCommand(s, c))
    {
        cmd.Parameters.AddWithValue("@NAME", Name);
        cmd.Parameters.AddWithValue("@PASSWORD", PW);
        cmd.Parameters.AddWithValue("@SALT", Salt);
        cmd.ExecuteNonQuery();
        MessageBox.Show("DATA ADDED");
    }
}
catch (OleDbException ex)
{
    MessageBox.Show(ex.Message);
}
catch (Exception ex)
{
    MessageBox.Show(ex.Message);
}
finally
{
    c.Close();
}

+1用于位置参数建议。我通常使用特定于db的ADO提供程序或Devart dotConnect,因此我没有意识到这一限制。@codenheim+1也很好地捕捉到了语法错误。我认为,一旦OP修复了参数,他将不得不处理下一件事。我在
OleDbCommand cmmd=new OleDbCommand(“INSERT-INTO-regulate(NAME,PASSWORD,SALT)”+“VALUES(?,,?)”,conn)并在此时获取“插入到命令中的语法错误”。我从与您所说的相同引号中的值开始,得到了相同的错误,只是尝试了不同的语法,但未能通过错误。@AarronDixon
PASSWORD
是Access中的保留字。请看我的最新答案。我也很确定我的名字。奇怪的是,在你弄明白一些事情之后,它看起来是如此明显。位置参数建议+1。我通常使用特定于db的ADO提供程序或Devart dotConnect,因此我没有意识到这一限制。@codenheim+1也很好地捕捉到了语法错误。我认为,一旦OP修复了参数,他将不得不处理下一件事。我在
OleDbCommand cmmd=new OleDbCommand(“INSERT-INTO-regulate(NAME,PASSWORD,SALT)”+“VALUES(?,,?)”,conn)并在此时获取“插入到命令中的语法错误”。我从与您所说的相同引号中的值开始,得到了相同的错误,只是尝试了不同的语法,但未能通过错误。@AarronDixon
PASSWORD
是Access中的保留字。请看我的最新答案。我也很确定我的名字。奇怪的是,在你弄明白一些事情之后,它看起来是如此明显。“OleDbCommand cmmd=新的OleDbCommand(“插入调节(名称、密码、SALT)值(?,?)”,康涅狄格州)但现在它给了我INSERT INTO语句NO中的语法错误。它全部进入一个记录,因此习惯上每个记录插入一次。'OleDbCommand cmmd=新的OleDbCommand(“插入调节(名称、密码、SALT)值(?,?)”,conn);'但现在它给了我INSERT INTO语句NO中的语法错误。它全部进入一条记录,因此习惯上每个记录插入一次。获得与其他尝试完全相同的“insert into语句中的语法错误”。我成功地创建了我的第一个哈希和盐析密码系统,没有问题,然后在将数据插入数据库时遇到了巨大的障碍。总是简单的事情,哈哈。得到完全相同的“语法错误插入到语句”作为其他尝试。我成功地创建了我的第一个哈希和salt密码系统没有问题,