【问题标题】:Pulling Data from MS Access DataBase to DataGridView using Variable使用变量将数据从 MS Access 数据库拉到 DataGridView
【发布时间】:2014-02-25 22:34:50
【问题描述】:

我正在设计一个从现有 MS Access 数据库中提取资产信息的 C# 应用程序。

string conn = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=O:\IT\IT Hardware\HWInv.accdb";
            string dbcmd = "SELECT tblInvCategory.Category, tblInvManufacturer.Manufacturer, tblInvModel.Model, tblInvMaster.SerialNumber, tblInvMaster.InvNumber, tblInvMaster.InvNumberExternal, tblInvCompany.CompanyName, tblInvCustomer.CustomerName, tblInvLocation.Location, tblInvMaster.OfficeNumber, tblInvTechs.TechName, tblInvMaster.TechDate, tblInvMaster.UpdatedBy, tblInvMaster.UpdatedDate, tblInvMaster.DeployDate, tblInvMaster.RetirePlanned, tblInvMaster.Status, tblInvMaster.PONumber, tblInvMaster.Notes, tblInvMaster.Audited FROM tblInvTechs INNER JOIN (tblInvModel INNER JOIN (tblInvManufacturer INNER JOIN (tblInvLocation INNER JOIN (tblInvCustomer INNER JOIN (tblInvCompany INNER JOIN (tblInvCategory INNER JOIN tblInvMaster ON tblInvCategory.CategoryID = tblInvMaster.CategoryID) ON tblInvCompany.CompanyID = tblInvMaster.CompanyID) ON tblInvCustomer.CustomerID = tblInvMaster.CustomerID) ON tblInvLocation.LocationID = tblInvMaster.LocationID) ON tblInvManufacturer.ManufacturerID = tblInvMaster.ManufacturerID) ON tblInvModel.ModelID = tblInvMaster.ModelID) ON tblInvTechs.TechID = tblInvMaster.TechID WHERE (((tblInvCustomer.CustomerName)="+ CustomerName + "))";

            OleDbConnection con = new OleDbConnection(conn);
            OleDbCommand cmd = new OleDbCommand(dbcmd, con);
            OleDbDataAdapter da = new OleDbDataAdapter(cmd);
            DataTable CustAssets = new DataTable();
            da.Fill(CustAssets);
            dataGridView1.DataSource = CustAssets;

我在 MS Access 中有一个针对本地 MS Access 表单的现有查询:

SELECT tblInvCategory.Category, tblInvManufacturer.Manufacturer, tblInvModel.Model, tblInvMaster.SerialNumber, tblInvMaster.InvNumber, tblInvMaster.InvNumberExternal, tblInvCompany.CompanyName, tblInvCustomer.CustomerName, tblInvLocation.Location, tblInvMaster.OfficeNumber, tblInvTechs.TechName, tblInvMaster.TechDate, tblInvMaster.UpdatedBy, tblInvMaster.UpdatedDate, tblInvMaster.DeployDate, tblInvMaster.RetirePlanned, tblInvMaster.Status, tblInvMaster.PONumber, tblInvMaster.Notes, tblInvMaster.Audited

FROM tblInvTechs INNER JOIN (tblInvModel INNER JOIN (tblInvManufacturer INNER JOIN (tblInvLocation INNER JOIN (tblInvCustomer INNER JOIN (tblInvCompany INNER JOIN (tblInvCategory INNER JOIN tblInvMaster ON tblInvCategory.CategoryID = tblInvMaster.CategoryID) ON tblInvCompany.CompanyID = tblInvMaster.CompanyID) ON tblInvCustomer.CustomerID = tblInvMaster.CustomerID) ON tblInvLocation.LocationID = tblInvMaster.LocationID) ON tblInvManufacturer.ManufacturerID = tblInvMaster.ManufacturerID) ON tblInvModel.ModelID = tblInvMaster.ModelID) ON tblInvTechs.TechID = tblInvMaster.TechID

WHERE (((tblInvCustomer.CustomerName)=[Forms]![frmInvSelectCustomerName]![CustomerName]));

如上插入时 SQL 命令失败。可变客户名称用于从 Access 数据库中仅提取该用户的那些记录,但在编译和运行时失败。

调用堆栈输出这是文本可视化器:

查询表达式“(((tblInvCustomer.CustomerName)=Joe Smith))”中有语法错误(缺少运算符)。

看来我的问题出在 WHERE 语句中。

非常感谢任何帮助。

谢谢,

【问题讨论】:

    标签: c# sql datagridview


    【解决方案1】:

    如果您使用参数化查询,则可以避免此类问题。
    出现错误的原因是,如果 CustomerName 字段是字符串,则条件中使用的每个值都应该用单引号括起来。
    但是,手动设置引号对于可能的 Sql 注入是危险的,并且如果用作值的字符串本身包含单引号,则可能导致其他语法错误。
    使用参数化查询避免所有这些

    string dbcmd = "SELECT ...... " & _ 
                   "WHERE (((tblInvCustomer.CustomerName)=?))";
    

    然后

    using(OleDbConnection con = new OleDbConnection(conn))
    using(OleDbCommand cmd = new OleDbCommand(dbcmd, con))
    using(OleDbDataAdapter da = new OleDbDataAdapter(cmd))
    {
         cmd.Parameters.AddWithValue("@p1", CustomerName);
         DataTable CustAssets = new DataTable();
         da.Fill(CustAssets);
         dataGridView1.DataSource = CustAssets;
    }
    

    【讨论】:

    • dataGridView1.DataSource = CustAssets;正在报告当前上下文中不存在 CustAssets。
    • 是的,抱歉,移到 using 块内
    • 谢谢你.. 对 dbcmd 的修改仍然给我带来了麻烦。它是一个字符串,因此使用 & 会引发 IDE 代码错误。
    • 无法解释这种行为,您接受了我的回答,但您解决了吗?
    • 我完成了。 DataGridView 控件的名称中有错字
    【解决方案2】:

    【讨论】:

      猜你喜欢
      • 2013-04-28
      • 2012-04-03
      • 1970-01-01
      • 1970-01-01
      • 2016-09-14
      • 1970-01-01
      • 2017-03-05
      • 2013-07-20
      • 1970-01-01
      相关资源
      最近更新 更多