如何使用C#将year作为参数传递给SQL查询

时间:2015-07-28 10:16:12

标签: c# sql sql-server

我在尝试将年份作为参数时遇到问题。我得到了

  

无法从字符串转换日期和/或时间

请参阅下面的代码

"SELECT distinct [study_patient_name],[study_patient_prenom] " +
"FROM examen where study_traitant_id='" + GridView1.SelectedRow.Cells[1].Text.Trim() + "'  "+
"and study_description ='"+GridView1.SelectedRow.Cells[7].Text.Trim()+ "' "+
"and study_rv_date between ('01/01/@date1')  ('31/12/@date2')" +
"order by [study_patient_name] asc ", myConnection);

myCommand.Parameters.AddWithValue("@date1", txtdate1.Text);
myCommand.Parameters.AddWithValue("@date2", txtdate2.Text);  

3 个答案:

答案 0 :(得分:1)

您知道如何参数化查询(您已经使用2个参数执行此操作),因此字符串连接没有任何借口 - 这是一个安全漏洞。一个大的!

除此之外,您正在寻找给定YEAR s范围内的任何日期。那是function for that

"and YEAR(study_rv_date) BETWEEN @date1 AND @date2 "

将整数作为年份传递。

答案 1 :(得分:1)

您应该学会参数化查询。这就是您的代码应该是这样的:

string sql = "SELECT DISTINCT [study_patient_name],[study_patient_prenom] " +
        "FROM examen WHERE study_traitant_id = @study_traitant_id " +
        "AND study_description = @study_description " +
        "AND study_rv_date BEWTWEEN @date1 AND @date2 " +
        "ORDER BY [study_patient_name]";

var myCommand = new System.Data.SqlClient.SqlCommand(sql, myConnection);

myCommand.Parameters.Add("@study_traitant_id", SqlDbType.VarChar, 50).Value = GridView1.SelectedRow.Cells[1].Text.Trim();
myCommand.Parameters.Add("@study_description", SqlDbType.VarChar, 50).Value = GridView1.SelectedRow.Cells[7].Text.Trim();
myCommand.Parameters.Add("@date1", SqlDbType.Date).Value = new DateTime(year, 1, 1);
myCommand.Parameters.Add("@date2", SqlDbType.Date).Value = new DateTime(year, 12, 31);

year这是您要作为参数传递的变量,您将从txtDate1txtDate2获取该变量。为了得到开始日期,我使用了:

new Datetime(year, 1, 1);

和结束日期:

new Datetime(year, 12, 31);

您可以根据自己的喜好使用其他功能。

另外请注意,最好使用Parameters.Add代替AddWithValue。根据{{​​3}}:

  

AddWithValue()函数存在问题:它必须推断   查询参数的数据库类型。这是事情:   有时它会弄错。

答案 2 :(得分:0)

从C#传递参数如下:

        myCommand.CommandText = @"
            SELECT DISTINCT
                [study_patient_name], [study_patient_prenom] 
            FROM 
                [examen]
            WHERE 
                [study_traitant_id] = @TraitantId
                AND
                [study_description] = @Description
                AND
                [study_rv_date] BETWEEN @StartOfYear AND @EndOfYear
        ";

        // Send Parameters
        myCommand.Parameters.AddWithValue("TraitantId", GridView1.SelectedRow.Cells[1].Text.Trim());
        myCommand.Parameters.AddWithValue("Description", GridView1.SelectedRow.Cells[7].Text.Trim());
        myCommand.Parameters.AddWithValue("@StartOfYear", new DateTime(int.Parse(txtdate1.Text), 1, 1));
        myCommand.Parameters.AddWithValue("@EndOfYear", new DateTime(int.Parse(txtdate2.Text), 12, 31));