2016-03-16 1 views
0

Итак, я пишу экспорт данных между SQL и Foxpro, я использую параметризованные строки, чтобы вытащить нужные данные, я также использую конкатенацию строк, чтобы получить запрошенную информацию на определенных записей, это, казалось, работало нормально, пока я не дошел до записи кода сортировки, где заявленная ошибка стала распространенной.Почему я получаю эту ошибку? Как обращаться с нулевыми значениями. Сообщение = Необходимо указать дополнительные параметры

В качестве краткого изложения. Установление соединения с обеими базами данных.

static void Main(string[] args) 
    { 
     using (var exportConnection = new SqlConnection(connectionString: "Data Source=Localhost;" 
                      + "Trusted_Connection=yes;" 
                      + @"connection timeout=30;" 
                      + @"database=001-CARL_V4")) 
     using (var importConnection = new OleDbConnection(connectionString: @"Provider=vfpoledb.1;" 
                      + 
                      @"data source=C:\Users\Joshua.cameron\Desktop\PCHomesImportTestBlank\PCHomesServer\DATABASE\pchomes.dbc") 
      ) 

Я настраиваю команду, чтобы выбрать из SQL:

  using (SqlCommand exportCommand = new SqlCommand(@"select 
    [ID] 
    ,[OwTitle] 
    ,[OwForenames] 
    ,[OwSurname]  
    ,[OwNum] 
    ,[OwAddress1] 
    ,[OwAddress2] 
    ,[OwAddress3] 
    ,[OwAddress4] 
    ,[OwPostcode] 
    ,[OwPhHome] 
    ,[OwPhWork] 
    ,[OwPhFax] 
    ,[OwPhMobile] 
    ,[OwEMail] 
    ,[OwBankName] 
    ,[OwAccNo] 
    ,[OwAccName] 
    ,[OwSalutation] 
    ,[OwNotes] 
    ,[OwSort1] 
    ,[OwSort2] 
    ,[OwSort3] 

из dbo.CARL_Owners», exportConnection))

И команда для вставки в VFP:

using (OleDbCommand importCommand = new OleDbCommand(@"INSERT INTO CLIENT 
    (CLCODE 
    ,clcodedesc 
    ,Title 
    ,Fname 
    ,Sname 
    ,Address1 
    ,Address3 
    ,Address5 
    ,Address4 
    ,Address6 
    ,Postcode 
    ,Phoneh 
    ,PhoneW 
    ,Facsimileh 
    ,Mobile 
    ,Emailaddr 
    ,Bankname 
    ,Bankacno 
    ,Bankacna 
    ,Salute 
    ,Notes 
    ,BANKSORT 
    ) 
VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)", 
      importConnection)) 

Добавление в параметризованные значения в вышеуказанный оператор INSERT:

importCommand.Parameters.AddWithValue("clcode", ""); 
      importCommand.Parameters.AddWithValue("clcodedesc", ""); 
      importCommand.Parameters.AddWithValue("Title", ""); 
      importCommand.Parameters.AddWithValue("Fname", ""); 
      importCommand.Parameters.AddWithValue("Sname", ""); 
      importCommand.Parameters.AddWithValue("Address1", ""); 
      importCommand.Parameters.AddWithValue("Address3", ""); 
      importCommand.Parameters.AddWithValue("Address5", ""); 
      importCommand.Parameters.AddWithValue("Address4", ""); 
      importCommand.Parameters.AddWithValue("Address6", ""); 
      importCommand.Parameters.AddWithValue("Postcode", ""); 
      importCommand.Parameters.AddWithValue("Phoneh", ""); 
      importCommand.Parameters.AddWithValue("PhoneW", ""); 
      importCommand.Parameters.AddWithValue("Facsimileh", ""); 
      importCommand.Parameters.AddWithValue("Mobile", ""); 
      importCommand.Parameters.AddWithValue("Emailaddr", ""); 
      importCommand.Parameters.AddWithValue("Bankname", ""); 
      importCommand.Parameters.AddWithValue("Bankacno", ""); 
      importCommand.Parameters.AddWithValue("Bankacna", ""); 
      importCommand.Parameters.AddWithValue("Salute", ""); 
      importCommand.Parameters.AddWithValue("Notes", ""); 
      importCommand.Parameters.AddWithValue("Banksort", ""); 

Откройте базу данных соединений:

exportConnection.Open(); 
      importConnection.Open(); 

заселить выше строки со значениями тянули из SQL:

var exportReader = exportCommand.ExecuteReader(); 

      while (exportReader.Read()) 
      { 
       string part1 = exportReader.GetSqlValue(2).ToString(); 
       string part2 = exportReader.GetSqlValue(3).ToString(); 
       string space = " "; 
       string code = exportReader.GetSqlValue(0).ToString(); 
       string clcode = exportReader.GetSqlValue(2).ToString(); 
       string title = exportReader.GetSqlValue(1).ToString(); 
       string sort1 = exportReader.GetSqlValue(20).ToString(); 
       string sort2 = exportReader.GetSqlValue(21).ToString(); 
       string sort3 = exportReader.GetSqlValue(22).ToString(); 
       // ID 
       importCommand.Parameters["clcode"].Value = string.Concat(clcode,code); 
       // 
       importCommand.Parameters["clcodedesc"].Value = string.Concat(title,space,part1,space,part2); 
       //OwTitle 
       importCommand.Parameters["Title"].Value = exportReader.GetSqlValue(1).ToString(); 
       //OwForenames 
       importCommand.Parameters["Fname"].Value = exportReader.GetSqlValue(2).ToString(); 
       //OwSurname 
       importCommand.Parameters["Sname"].Value = exportReader.GetSqlValue(3).ToString(); 
       //OwNum 
       importCommand.Parameters["Address1"].Value = exportReader.GetSqlValue(4).ToString(); 
       //[OwAddress1] 
       //[OwAddress2] 
       //[OwAddress3] 
       //[OwAddress4] 
       importCommand.Parameters["Address3"].Value = exportReader.GetSqlValue(5).ToString(); 
       importCommand.Parameters["Address5"].Value = exportReader.GetSqlValue(6).ToString(); 
       importCommand.Parameters["Address4"].Value = exportReader.GetSqlValue(7).ToString(); 
       importCommand.Parameters["Address6"].Value = exportReader.GetSqlValue(8).ToString(); 
       //OwPostcode 
       importCommand.Parameters["Postcode"].Value = exportReader.GetSqlValue(9).ToString(); 
       //OwPhHome 
       importCommand.Parameters["Phoneh"].Value = exportReader.GetSqlValue(10).ToString(); 
       //OwPhWork 
       importCommand.Parameters["PhoneW"].Value = exportReader.GetSqlValue(11).ToString(); 
       //OwPhFax 
       importCommand.Parameters["Facsimileh"].Value = exportReader.GetSqlValue(12).ToString(); 
       //OwPhMobile 
       importCommand.Parameters["Mobile"].Value = exportReader.GetSqlValue(13).ToString(); 
       //OwEMail 
       importCommand.Parameters["Emailaddr"].Value = exportReader.GetSqlValue(14).ToString(); 
       //OwBankName 
       importCommand.Parameters["Bankname"].Value = exportReader.GetSqlValue(15).ToString(); 
       //OwAccNo 
       importCommand.Parameters["Bankacno"].Value = exportReader.GetSqlValue(16).ToString(); 
       //OwAccName 
       importCommand.Parameters["Bankacna"].Value = exportReader.GetSqlValue(17).ToString(); 
       //OwSalutation 
       importCommand.Parameters["Salute"].Value = exportReader.GetSqlValue(18).ToString(); 
       //OwNotes 
       importCommand.Parameters["Notes"].Value = exportReader.GetSqlValue(19).ToString(); 
       //OwSort1 
       //OwSort2 
       //OwSort3 
       importCommand.Parameters["Banksort"].Value = string.Concat(sort1, sort2, sort3); 

комментируемой линия соответствующих записей в базе данных SQL.

Наконец я выполнить запрос и закрыть подключение:

try 
       { 
        importCommand.ExecuteNonQuery(); 
       } 
       catch (Exception e) 
       { 
        Console.Write("Error Writing to database"); 
        Console.Write(e); 
        Console.ReadKey(); 
       } 
      } 

      // done 
      Console.WriteLine("Complete!"); 
      Console.ReadKey(); 
      exportConnection.Close(); 
      importConnection.Close(); 

Моя теория состоит в том, что эта строка значение:

    importCommand.Parameters["Banksort"].Value = string.Concat(sort1, sort2, sort3); 

вызывает проблемы, так как первые записи в таблице, являются «NULL "

+0

Вы действительно не должны использовать 'AddWithValue', как это, просто используйте' Add ('и использовать перегрузку, которая принимает в' DbType' –

+0

о прямо чем разница между этими двумя –

+1

? Ну, 'AddWithValue (' берет лучшее предположение о том, какой тип данных параметра должен основываться на том, что вы передали в значение, 'Add (' вы можете точно сказать, какой тип данных должен быть, поэтому нет никаких шансов для ошибка от неправильной наилучшей догадки –

ответ

1

Вы наверняка должны использовать AddWithValue. Ошибка не имеет к этому никакого отношения. Вы должны следить за сообщением, чтобы узнать причину ошибки :) Он говорит «Должен указать дополнительные параметры». Это означает, что у вас меньше параметров, чем то, что вам действительно нужно. IOW ошибка находится в счете? заполнители. Они обрабатываются позиционно и должны соответствовать счету ожидаемого значения. то есть:

insert into myTable (field1, field2) values (?,?) 

правильно, в то время как:

insert into myTable (field1, field2) values (?) 

даст ошибку, которую вы видите. Вы говорите, что у вас есть 2 столбца, но укажите только один параметр-заполнитель. Добавить достаточно? (так как я вижу 22 значения и 21? существует). И, конечно же, не забудьте добавить параметры (с AddWithValue) в том же порядке этих ожидаемых параметров (первый AddWithValue() связывается с первым? И, следовательно, поле1, второе связывается со вторым? И thuse field2 и т. Д.).

PS: Вы могли бы написать этот SQL так, чтобы вы не считали?неправильно:.

string fields = @"CLCODE 
    ,clcodedesc 
    ,Title 
    ,Fname 
    ,Sname 
    ,Address1 
    ,Address3 
    ,Address5 
    ,Address4 
    ,Address6 
    ,Postcode 
    ,Phoneh 
    ,PhoneW 
    ,Facsimileh 
    ,Mobile 
    ,Emailaddr 
    ,Bankname 
    ,Bankacno 
    ,Bankacna 
    ,Salute 
    ,Notes 
    ,BANKSORT"; 

string sql = string.Format("INSERT INTO CLIENT ({0}) values ({1})", 
    fields, 
    string.Join(",",fields.Split(',').Select(f => "?"))); 
+0

очень хороший способ избежать '?' Подсчета совпадений. +1 –

+0

Вы, сэр, герой, большое спасибо, это была точная проблема. Не могу поверить, что я пропустил это. –