我在尝试将年份作为参数时遇到问题。我得到了
无法从字符串转换日期和/或时间
请参阅下面的代码
"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);
答案 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
这是您要作为参数传递的变量,您将从txtDate1
和txtDate2
获取该变量。为了得到开始日期,我使用了:
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));