C# select SQL 带参数查询

C# select SQL query with parameter

我想将数据库从 MS Access 迁移到 SQL 服务器,我正在尝试修改我的 SQL 查询。他们在 MS Access 中工作。

我有这个 C# 代码:

private DataSet GetIncident_ByIncident(string inc_num)
{
    MainIncident mi = new MainIncident();
    mi.incident_full_number = inc_num;

    string query = @"SELECT MainIncidentTable.Incident_Full_Num ,
            MainIncidentTable.Customer_Name ,
            MainIncidentTable.Service_Representative ,
            MainIncidentTable.Incident_Date ,
            MainIncidentTable.Average_Invoice ,
            MainIncidentTable.Street ,
            MainIncidentTable.City ,
            MainIncidentTable.Contact ,
            IncidentStatuses.Incident_Status_Name,
            Stations.Station_Name 

            FROM(MainIncidentTable INNER JOIN
                 Stations ON MainIncidentTable.Current_Station_ID = Stations.Station_ID)
                 INNER JOIN IncidentStatuses ON MainIncidentTable.Current_Incident_Status_Id = IncidentStatuses.Incident_Status_Id
            WHERE Incident_Full_Num = '@Incident_Full_Num'";

    List<OleDbParameter> l = new List<OleDbParameter>();

    l.Add(new OleDbParameter("@Incident_Full_Num", mi.incident_full_number));
    l.Add(new OleDbParameter("@Customer_Name", mi.customer_name));
    l.Add(new OleDbParameter("@Service_Representative", mi.service_representative));
    l.Add(new OleDbParameter("@Incident_Date", mi.incident_date));
    l.Add(new OleDbParameter("@Average_Invoice", mi.average_invoice));
    l.Add(new OleDbParameter("@Street", mi.street));
    l.Add(new OleDbParameter("@City", mi.city));
    l.Add(new OleDbParameter("@Contact", mi.contact));
    l.Add(new OleDbParameter("@Current_Station_ID", mi.current_station_id));
    l.Add(new OleDbParameter("@Current_Incident_Status_Id", mi.current_incident_status_id));

    var con = GetDataSetWithParameters(query, l);

    return con;
}

连接方式:

public static DataSet GetDataSetWithParameters(string query, List<OleDbParameter> parameters)
{
    DataSet ds = new DataSet();
       
    OleDbConnection Con = new OleDbConnection(sqlConnectionString);
    Con.Open();

    try
    {
        using (OleDbCommand cmd = new OleDbCommand(query, Con))
        {
            if (parameters != null)
            {
                cmd.Parameters.AddRange(parameters.ToArray());
            }

            using (OleDbDataAdapter Adapter = new OleDbDataAdapter(cmd))
            {
                Adapter.Fill(ds);
            }

            return ds;
        }
    }
    catch
    {
        throw;
    }
    finally
    {
        CloseConnection(ref Con);
    }
}

SQL 查询正在运行但未返回行。我猜这个问题是查询中参数的语法。

有人可以指导我吗?

您不得将参数括在引号中。图书馆会处理这件事。即使用

WHERE Incident_Full_Num = @Incident_Full_Num

而不是

WHERE Incident_Full_Num = '@Incident_Full_Num'

编辑

哦,抱歉,忘了,OleDb 不使用命名参数,只使用位置参数。 See docs

所以要么将您的查询更新为

WHERE Incident_Full_Num = ?

或者您使用 SqlCommandSqlParameter 而不是 OleDbCommandOleDbParameter

请注意,如果您使用 OleDbCommand,则传递参数的顺序很重要。即,第一个 ? 将绑定到第一个参数,第二个 ? 将绑定到第二个参数,依此类推。如果您在查询中两次需要相同的参数,您也需要传递两次。

而且好像只用了第一个参数。为什么要将大量未使用的参数传递给命令?