Winforms:运行 oledb 连接时出错(可安装的 Isam,未为命令对象设置 Commandtext)

Posted

技术标签:

【中文标题】Winforms:运行 oledb 连接时出错(可安装的 Isam,未为命令对象设置 Commandtext)【英文标题】:Winforms: Errors when running oledb connection (installable Isam, Commandtext was not set for the command object) 【发布时间】:2019-01-22 03:58:44 【问题描述】:

我的情况是,一旦我按下按钮,代码将从 MS Access 中检索 EquipmentBrandEquipmentTypeSerialNumber 相关。我可以通过oledb 类检索序列号并使其自动完成。但是,现在我在检索设备品牌和类型时遇到问题。我尝试了两个代码,但都有不同的错误。这是我的访问截图:MS Access screenshot

对于第一个错误,我已将平台更改为 x86。

第一个错误:在 connection.Open(); 行找不到可安装的 Isam

private void Form1_Load(object sender, EventArgs e)
    
        oledb da = new oledb();
        textBox1.AutoCompleteMode = AutoCompleteMode.SuggestAppend;
        textBox1.AutoCompleteSource = AutoCompleteSource.CustomSource;
        textBox1.AutoCompleteCustomSource = da.Loadserialnum();
    

private void button2_Click(object sender, EventArgs e)
    
        var connection = new OleDbConnection("Provider = Microsoft.ACE.OLEDB.12.0;Data Source = C:\\Users\\equipment.accdb");
        var command = connection.CreateCommand();
        
            command.Parameters.AddWithValue("SerialNumber", (textBox1.Text));
            connection.Open(); //error here
            var reader = command.ExecuteReader();
            while (reader.Read())
            
                textBox2.Text = reader["EquipmentBrand"].ToString();
                textBox3.Text = reader["EquipmentType"].ToString();
            
        
    

对于第二个错误,我更改了Data Source(另一种适用于遇到我第一个问题的其他人的方法),但出现了一个新错误:Command text was not set for command object at line @ 987654329@

希望能得到一些帮助谢谢!

【问题讨论】:

你不应该使用 textbox1.Text 因为这将允许 SQL 注入攻击。 【参考方案1】:

由于OleDbConnection.CreateCommand()返回OleDbCommand的实例,你需要在打开连接之前将CommandText属性设置为你想要执行的查询字符串,否则会抛出Command text was not set for command对象 错误。下面是一个使用CommandText属性的例子:

private void button2_Click(object sender, EventArgs e)

    var connection = new OleDbConnection("Provider = Microsoft.ACE.OLEDB.12.0;Data Source = C:\\Users\\equipment.accdb");
    var command = connection.CreateCommand();

    // query string example
    command.CommandText = "SELECT * FROM TableName WHERE SerialNumber = ?"; 

    command.Parameters.AddWithValue("SerialNumber", (textBox1.Text));
    connection.Open(); // open the connection
    var reader = command.ExecuteReader();
    while (reader.Read())
    
        textBox2.Text = reader["EquipmentBrand"].ToString();
        textBox3.Text = reader["EquipmentType"].ToString();
    

【讨论】:

OLEDB 参数是位置未命名的。所以这将起作用,但如果您有多个参数,则必须按照它们在 SQL 中出现的顺序添加它们。为了清楚起见,您可以说 command.Parameters.AddWithValue("?", (textBox1.Text)); 感谢您的回复。我已经添加了命令文本并且它起作用了。我会注意 SQL 注入的风险并进行相应的改进。我可以知道除了textBox1.Text 的用法还有哪些选项?

以上是关于Winforms:运行 oledb 连接时出错(可安装的 Isam,未为命令对象设置 Commandtext)的主要内容,如果未能解决你的问题,请参考以下文章

Jet.OLEDB 在连接时“找不到可安装的 ISAM”。打开

Winforms (C#) 中的 OleDb 参数查询:没有错误但没有更新行

从 C# 通过 OLEDB 执行更新时出错

如何在运行时以编程方式从本地数据库获取连接字符串?时间:2019-06-01 标签:c#winforms

Winforms问题-创建窗口句柄时出错[重复]

从 SQL Server 查询“Microsoft.ACE.OLEDB.12.0”提供程序时出错