【问题标题】:variable that does not work when I use a query but does not throw exception c#变量在我使用查询时不起作用但不会引发异常 c#
【发布时间】:2017-07-24 13:20:16
【问题描述】:

当我尝试使用 query6 运行它时 --> [religion] = @religionVar 它只将表的标题返回到数据表中,但是当我对 query5 执行此操作时,它会将我返回到表中

string query5 = "SELECT * FROM[PhoneTableSql] WHERE[district] = '5' AND([religion] = @religionVar OR[religion] = '4')";
string query6 = "SELECT * FROM[PhoneTableSql] WHERE[district] = '6' AND([religion] = @religionVar OR[religion] = '4')";

如果我这样做,query6 会返回良好的表

string query5 = "SELECT * FROM[PhoneTableSql] WHERE[district] = '5' AND([religion] = @religionVar OR[religion] = '4')";
string query6 = "SELECT * FROM[PhoneTableSql] WHERE[district] = '6' AND([religion] = '1' OR[religion] = '4')";

我尝试运行它 mssql 并且它工作正常,但我无法解释为什么它首先工作而不能在另一个工作

string query5 = "SELECT * FROM[PhoneTableSql] WHERE[district] = '5' AND([religion] = @religionVar OR[religion] = '4')";
string query6 = "SELECT * FROM[PhoneTableSql] WHERE[district] = '6' AND([religion] = '1' OR[religion] = '4')";

using (SqlConnection con = new SqlConnection(@"Data Source=CATISERVER1\SQLEXPRESS;Initial Catalog=dsa;Persist Security Info=True;User ID=mcsager;Password=*******"))
{
    try
    {                    
        SqlCommand cmd5 = new SqlCommand(query5, con);
        cmd5.Parameters.AddWithValue("@religionVar", 1);
        SqlCommand cmd6 = new SqlCommand(query6, con);
        cmd6.Parameters.AddWithValue("@religionVar", 1);
        SqlDataAdapter adpter5 = new SqlDataAdapter(cmd5);
        adpter5.Fill(MyAppManager.ChangeFactorWeightsInstance.DtDistrict_5);
        SqlDataAdapter adpter6 = new SqlDataAdapter(cmd6);
        adpter6.Fill(MyAppManager.ChangeFactorWeightsInstance.DtDistrict_6);
    }
    catch{}
}

【问题讨论】:

  • 可能是因为您传入了 INT 值,但该列是 VARCHAR(如查询中的单引号所示)。
  • 您是否注意到OR[religion] 之间没有空格?
  • MyAppManager.ChangeFactorWeightsInstance.DtDistrict_6 这行对你的数据表有什么作用?如果在 MSSQL 中运行按预期工作,您必须对返回结果做一些不同的事情。如果将query5 传递给adapter6 会发生什么?它们似乎具有相同的结构。
  • 您可能想看看这篇文章。 blogs.msmvps.com/jcoehoorn/blog/2014/05/12/…
  • “但不抛出异常” 好吧,你已经在这里吞下了它:catch{}。大多数时候都清空捕获块are a bad idea。这相当于将黑色胶带贴在发动机警告灯上。

标签: c# sql asp.net .net sql-server


【解决方案1】:

您在一个连接上使用了两次相同的变量。在 sql 中给每个查询它自己的变量。我拿走了你的代码,用@religiongvar1 和@religionvar2 替换了@religionvar。

string query5 = "SELECT * FROM[PhoneTableSql] WHERE[district] = '5' AND([religion] = @religionVar1 OR[religion] = '4')";
string query6 = "SELECT * FROM[PhoneTableSql] WHERE[district] = '6' AND([religion] = @religionVar2 OR[religion] = '4')";

    using (SqlConnection con = new SqlConnection(@"Data Source=CATISERVER1\SQLEXPRESS;Initial Catalog=dsa;Persist Security Info=True;User ID=mcsager;Password=*******"))
    {
        try
        {                    
            SqlCommand cmd5 = new SqlCommand(query5, con);
            cmd5.Parameters.AddWithValue("@religionVar1", 1);
            SqlCommand cmd6 = new SqlCommand(query6, con);
            cmd6.Parameters.AddWithValue("@religionVar2", 1);

            SqlDataAdapter adpter5 = new SqlDataAdapter(cmd5);
            adpter5.Fill(MyAppManager.ChangeFactorWeightsInstance.DtDistrict_5);
            SqlDataAdapter adpter6 = new SqlDataAdapter(cmd6);
            adpter6.Fill(MyAppManager.ChangeFactorWeightsInstance.DtDistrict_6);
        }
        catch{}
    }

【讨论】:

  • 我相当有信心这不会引起问题,尤其是原始问题中描述的问题。
  • 如果您能准确指出我们所做的更改,那就太好了。这就像一场寻找差异的游戏
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-16
  • 2022-07-19
  • 2016-10-05
  • 2014-08-17
  • 1970-01-01
  • 2022-06-13
相关资源
最近更新 更多