从表单控件中获取条件

时间:2015-07-28 18:44:31

标签: c# sql

我在表单(MaskedTextBoxMaskedTextBox1)上有两个MaskedTextBox1元素,代表DateFromDateTo以及一个ComboBox({{ 1}})我已经从Collection Property部分填充了

是否可以告诉我如何使用ComboBox1maskedTextBoxes替换之间的日期以替换ComboBox

Select("branch = 'EN5'").FirstOrDefault();

我尝试了以下但是它没有工作:

sda = new SqlDataAdapter(@"SELECT branch, SUM(CONVERT(DECIMAL(8,2),[can]/1.2)) AS [C1], 
          SUM(CONVERT(DECIMAL(8,2),[carton]/1.2)) AS [C2], 
          SUM(CONVERT(DECIMAL(8,2),[other])) AS [O] FROM detail 
          WHERE dates BETWEEN '2015-04-01' AND '2015-04-30'
          GROUP BY branch ", cn);
DataSet ds = new DataSet();
sda.Fill(ds);
DataRow dr = ds.Tables[0].Select("branch = 'EN5'").FirstOrDefault();
if (dr != null)
{
    label63.Text = dr["C1"].ToString();
    label62.Text = dr["C2"].ToString();
}

已调整但现在收到错误消息 关键字BETWEEN附近的语法不正确

+'MaskedTextBox1.Value' And +'MaskedTextBox2.Value'

Select("branch = +'ComboBox1.Value'").FirstOrDefault();

已调整但现在收到错误消息 关键字BETWEEN附近的语法不正确

2 个答案:

答案 0 :(得分:0)

简化,然后分裂和征服。

第一

通常更好地准备字符串,以便您可以调试并查看值。您还可以复制SQL中的字符串以查看是否正常工作。

string strSQL = "SELECT branch, SUM(CONVERT(DECIMAL(8,2),[can]/1.2)) AS [C1], 
      SUM(CONVERT(DECIMAL(8,2),[carton]/1.2)) AS [C2], 
      SUM(CONVERT(DECIMAL(8,2),[other])) AS [O] FROM detail 
      WHERE dates BETWEEN " + MaskedTextBox1.Value + " And " + MaskedTextBox2.Value +
      "GROUP BY branch "
sda = new SqlDataAdapter(strSQL, cn);

第二

在sql server中更好地使用PARAMETERS来避免Sql Injection

string commandText = "UPDATE Sales.Store SET Demographics = @demographics "
    + "WHERE CustomerID = @ID;";

using (SqlConnection connection = new SqlConnection(connectionString))
{
    SqlCommand command = new SqlCommand(commandText, connection);
    command.Parameters.Add("@ID", SqlDbType.Int);

第三

需要使用LINQ表单

Select(b =>  b.brand == ComboBox1.Value).FirstOrDefault();

答案 1 :(得分:0)

您不应该通过将字符串与用户输入连接来构建SQL语句,因为这会使您的应用程序容易受到SQL injection的攻击(请阅读!)。

相反,您应该使用参数化查询(as shown here for example)。在你的情况下,这将是这样的:

sda = new SqlDataAdapter(@"SELECT branch, SUM(CONVERT(DECIMAL(8,2),[can]/1.2)) AS [C1], 
      SUM(CONVERT(DECIMAL(8,2),[carton]/1.2)) AS [C2], 
      SUM(CONVERT(DECIMAL(8,2),[other])) AS [O] FROM detail 
      WHERE dates BETWEEN @from AND @to
      GROUP BY branch ", cn);

sda.SelectCommand.Parameters.Add("@from", MaskedTextBox1.Value);
sda.SelectCommand.Parameters.Add("@to", MaskedTextBox2.Value);

然后您必须确保用户输入的格式正确。最好的方法可能是先将用户输入转换为DateTime值,然后再将它们添加到SelectCommand.Parameters

var from = DateTime.Parse(MaskedTextBox1.Value);
var to = DateTime.Parse(MaskedTextBox2.Value);
sda.SelectCommand.Parameters.Add("@from", from);
sda.SelectCommand.Parameters.Add("@to", to);

(另见DateTime.TryParse)。