2013-02-10 53 views
0
SqlCommand cmd = new SqlCommand(); 
cmd.Connection = con; 
cmd.CommandType = CommandType.Text; 
cmd = CreateParameterizedQuery(); 
SqlDataAdapter dap = new SqlDataAdapter(); 
dap.SelectCommand = cmd; 
DataTable tbl = new DataTable(); 
dap.Fill(tbl); 
if (tbl.Rows.Count > 0) 
{ 
    grid.DataSource = tbl; 
} 

实际的SQL查询将在SQL Management Studio中产生结果。但是我得到0行数据。我在tbl.Rows.Count处设置了一个断点,我发现它是0,并且步进将跳过必要的代码来设置数据源。SqlDataAdapter给我的结果为0

private SqlCommand CreateParameterizedQuery() 
    { 
     SqlCommand command = new SqlCommand(); 
     string[] allTheseWords; 
     if (textBoxAllTheseWords.Text.Length > 0) 
     { 
      allTheseWords = textBoxAllTheseWords.Text.Split(' '); 
      string SQLQuery = "SELECT distinct [databaseName].[dbo].[customerTable].[name], [databaseName].[dbo].[customerTable].[dos], [databaseName].[dbo].[customerTable].[ACC], [databaseName].[dbo].[reportTable].[id], [databaseName].[dbo].[reportTable].[ACC], [databaseName].[dbo].[reportTable].[fullreport] FROM [databaseName].[dbo].[reportTable], [databaseName].[dbo].[customerTable] WHERE "; 
      int i = 0; 
      foreach (string word in allTheseWords) 
      { 
       var name = "@word" + (i++).ToString(); 
       command.Parameters.AddWithValue(name, "'%" + word + "%'"); 
       SQLQuery = SQLQuery + String.Format(" [databaseName].[dbo].[reportTable].[fullreport] LIKE {0} AND ", name); 
      } 
      SQLQuery = SQLQuery + " [databaseName].[dbo].[customerTable].[ACC] = [databaseName].[dbo].[reportTable].[ACC]"; 
      command.CommandText = SQLQuery; 
     } 
     return command; 
    } 

我使用与C#的WinForm在Windows 8


的的SQLQuery变量调试

SELECT distinct [databaseName].[dbo].[customerTable].[name], [databaseName].[dbo].[customerTable].[dos], [databaseName].[dbo].[customerTable].[ACC], [databaseName].[dbo].[reportTable].[customerID], [databaseName].[dbo].[reportTable].[ACC], [databaseName].[dbo].[reportTable].[fullreport] FROM [databaseName].[dbo].[reportTable], [databaseName].[dbo].[customerTable] WHERE [databaseName].[dbo].[reportTable].[fullreport] LIKE @word0 AND [databaseName].[dbo].[customerTable].[ACC] = [databaseName].[dbo].[reportTable].[ACC] 

debugMySQL是吐出来的是SQL查询使用的方法包含此数据取代参数

public void debugMySQL() 
    { 
     string query = command.CommandText; 
     foreach (SqlParameter p in command.Parameters) 
     { 
      query = query.Replace(p.ParameterName, p.Value.ToString()); 
     } 
     textBox1.Text = query; 
    } 

输出类似于

SELECT distinct [databaseName].[dbo].[customerTable].[name], [databaseName].[dbo].[customerTable].[dos], [databaseName].[dbo].[customerTable].[ACC], [databaseName].[dbo].[reportTable].[id], [databaseName].[dbo].[reportTable].[ACC], [databaseName].[dbo].[reportTable].[fullreport] FROM [databaseName].[dbo].[reportTable], [databaseName].[dbo].[customerTable] WHERE [databaseName].[dbo].[reportTable].[fullreport] LIKE '%single%' AND [databaseName].[dbo].[customerTable].[ACC] = [databaseName].[dbo].[reportTable].[ACC] 
+1

使用事件探查器来查看发送到SQL Server的真实查询。 – 2013-02-10 19:20:00

+1

你在调试器中检查过'SQLQuery'的内容吗?你能在你的问题中发布完整的SQL字符串吗? – 2013-02-10 19:20:41

+0

我纠正了你的代码中的一些错误,但它是什么意思?你真的测试了什么? – 2013-02-10 19:22:00

回答

2

你可以看到使用SQL Profiler它的参数值,参数化查询。

enter image description here

+0

当我运行它时,它说@ word0 – 2013-02-15 03:19:15