2013-06-03 1 views
0

Im пытается сохранить мое заявление SQL в .sql файлов в папке ресурсов,Проблема с использованием .sql команды в файле ресурсов

Мне нужно передать в 2 значения в команде SQL, но им с трудностями, делая это

мой SQL выглядит следующим образом:

SELECT * FROM claim_header WHERE @columnname = @testcase; 

Мой класс называть его:

class DataValidation 
{ 
    public string testCase { get; set; } 
    public string elementName { get; set; } 
    public string fileDestination = ConfigurationSettings.AppSettings["ValidationReportDestination"]; 
    public List<string> testCasesList = new List<string>(); 

    public void PrintValidationResults() 
    { 
     int counter = 0; 
     SqlConnection sqlConnection = new SqlConnection(constring); 
     string sqlConnectionStringPassed = "select * from claim_header"; 
     string sqlConnectionStringFailed = "select * from dbo.[SSIS Exception Info] where data_entity_name like '%CLAIM%' and package_name like '%Extract%' order by 1 desc;"; 
     SqlDataReader myReaderPassed, myReaderFailed = null; 
     SqlCommand sqlCommandPassed = new SqlCommand(sqlConnectionStringPassed, sqlConnection); 
     SqlCommand sqlCommandFailed = new SqlCommand(sqlConnectionStringFailed, sqlConnection); 

     string sqlPass = EmbeddedResource.GetString("PassQuery.sql"); 
     SqlCommand cmd = new SqlCommand(sqlPass,sqlConnection); 

     cmd.Parameters.AddWithValue("@testcase", "'" + testCasesList[counter] + "'"); 
     cmd.Parameters.AddWithValue("@columnname", elementName); 

     try 
     { 
      sqlConnection.Open(); 
      myReaderPassed = sqlCommandPassed.ExecuteReader(); 
      myReaderFailed = sqlCommandFailed.ExecuteReader(); 
      object query = cmd.ExecuteScalar(); 
      string test = cmd.CommandText; 

      //Print Passed Results 
      Directory.CreateDirectory(fileDestination); 
      using (StreamWriter resultWriter = new StreamWriter((fileDestination + elementName + ".txt"), true)) 
      { 
        while (myReaderPassed.Read()) 
        { 
         foreach (string testCase in testCasesList) 
         { 
          if (myReaderPassed[elementName].ToString() == testCase) 
          { 
           { 
            resultWriter.WriteLine("Field: " + elementName.ToString()); 
            resultWriter.WriteLine("Test Case: " + testCasesList[counter]); 
            resultWriter.WriteLine("Passed:" + "Yes"); 
            resultWriter.WriteLine("Test: " + cmd.ExecuteScalar()); 
           } 
          } 
         } 
         counter++; 
        }   
       } 
      }   

     catch (Exception e) 
     { 
      MessageBox.Show(e.ToString()); 
     } 

    } 

в го is line: object query = cmd.ExecuteScalar(); запрос всегда отображается как null. Если я не передаю какие-либо параграфы, это заявление работает отлично? Что мне не хватает?

ответ

0

Хотя это не означает, что ваш запрос не запущен, я не думаю, что вы получите результат, который вам нужен, потому что вы не можете параметризовать имя столбца, поэтому ваш запрос должен принять форму:

SELECT * FROM claim_header WHERE columnname = @testcase; 

И у вас есть один или несколько запросов в зависимости от того, что столбец вы хотите выполнить поиск по

Если вы предоставляете SQL, как:

SELECT * FROM claim_header WHERE @columnname = @testcase; 

единственное, что вы с действительно, с таким запросом задаются два параметра с одним и тем же значением (в этом случае вы получите все строки из таблицы, потому что это как сказать SELECT * FROM table WHERE 1 = 1) или установить их в разные значения, в в этом случае вы получите 0 строк в результатах (потому что это похоже на высказывание SELECT * FROM table WHERE 1 = 0)

Если вам нужны динамические имена столбцов, вам действительно нужно будет сделать свой SQL в вашем файле ресурсов как это:

SELECT * FROM claim_header WHERE {0} = @testcase; 

и код, как это:

string sqlCommand = string.Format(Resources.Whatever.SQL, elementName); 

Таким образом, {0} заменяется на «Claim_id» или аналогичный. Но имейте в виду опасности SQL injection

+0

Ресурсы. Без разницы.SQL - эта часть не работает для меня, любые идеи? Не нужно беспокоиться о SQL-инъекции, ее для собственной автоматизации тестирования. – Steve2056726

+0

Я получил это, используя это: string.Format (EmbeddedResource.GetString («PassQuery.sql»), elementName. – Steve2056726

0

одиночные кавычки не должны быть добавлены при создании параметра

Изменить

cmd.Parameters.AddWithValue("@testcase", "'" + testCasesList[counter] + "'"); 

Для

cmd.Parameters.AddWithValue("@testcase", testCasesList[counter]); 
+0

Спасибо, я не был уверен в этом, я добавил их только для того, чтобы узнать, не имеет значения – Steve2056726

0

Не видя ваш SQL заявление, это трудно сказать. Однако я бы рискнул, что это ошибка в обработке строк. У вас есть эта строка:

cmd.Parameters.AddWithValue("@testcase", "'" + testCasesList[counter] + "'"); 

Вы явно переносите свою строку в 's. Это необязательно при использовании параметров команды. Любое экранирование, которое необходимо выполнить, будет выполняться поставщиком данных .NET (хотя, скорее всего, не требуется экранирование), большинство RDBMS предоставляют средства для передачи параметров напрямую без их преобразования в строки и вставки в SQL).

Смежные вопросы