SQL - 参数化

时间:2014-02-04 18:08:11

标签: c# sql

我正在尝试使用SQL请求。因此,我想使用界面IDbCommand

我尝试使用参数添加请求的值,但如果我使用我的脚本,查询看起来像

SELECT * FROM DB WHERE Data = @val

然后我得到SqlException

有人可以帮助我吗?

// "Using": - To make sure that the connection get closed correctly!
using (IDbConnection con = new SqlConnection(connectionstring)) 
{ 
    try 
    {
        /*
         * Use this for Initialize that it is a SQL Server, 
         * IDbConnection is for every connection
         */

        IDbCommand sql = con.CreateCommand();

        var exprParam = sql.CreateParameter();
        sql.CommandText = comand;
        exprParam.Value = value;
        exprParam.ParameterName = "@val";
        sql.Parameters.Add(exprParam);

        con.Open(); 

        // Connect to DB. Timeout: 15 Sekunden
        IDataReader rdr = sql.ExecuteReader();  

        // Build DataReader
        while (rdr.Read())  
            // Read data from console
            numberOfRows = Convert.ToInt32(rdr[0]);
     }
     catch(Exception ex)
     {
     }
}

2 个答案:

答案 0 :(得分:1)

使用以下代码修改代码:

     try
     {
        string value = "text value from your control";
        int numberOfRows = 0;

        //For Sql Server Authentication
        string connectionString = 
                @"server=yourservername;InitialCatalog=yourdatabasename;
                                          User Id=sa;Password=yoursqlserverpassword";

         //For Windows Authentication
        string connectionString = 
                @"server=yourservername;InitialCatalog=yourdatabasename;
                                         Integrated Security=SSPI";

        using(SqlConnection cn = new SqlConnection(connectionString))
        {
            cn.Open();
            string query = "SELECT * FROM DB WHERE Data=@val";

            SqlCommand cmd = new SqlCommand(query, cn);
            cmd.Parameters.Add(new SqlParameter("@val", value));

            SqlDataReader dr = cmd.ExecuteReader();
            while (dr.Read())
            {
                numberOfRows += Convert.ToInt32(dr[0].ToString());
            }
        }
     }
     catch(Exception ex)
     {
        //Handle your Error - or show it if required
     }

答案 1 :(得分:0)

.NET Framework的数据访问接口不是为您直接使用而设计的。相反,它们是为了在构建新的数据提供者时提高一致性(数据提供者的示例是System.Data.SqlClientSystem.Data.OleDb等等)。这意味着编写代码以访问(例如)Oracle数据库与使用SQL Server数据的代码类似。由于这些接口,在切换数据提供程序时需要更改的代码量已经很小,但在直接使用提供程序时,它永远不会是100%通用的。

如果您的客户希望将来能够灵活地更改数据访问策略,那么值得您做一些将应用程序拆分为不同层的研究,特别是将数据访问逻辑与您使用的客户端代码分开那个数据。您可能还想考虑使用ORM,例如Entity Framework。

要回答有关SQL查询的更紧迫的问题,可以使用以下代码:

using (var con = new SqlConnection(connectionstring))
{
    con.Open();

    using (var cmd = new SqlCommand("<YOUR QUERY TEXT>", con))
    {
        cmd.Parameters.AddWithValue("@val", yourValue);

        using (var reader = cmd.ExecuteReader())
        {
            while (reader.Read())
            {
                ...
            }
        }
    }
}