2013-11-26 5 views
0

Я пытаюсь получить значение столбца из другой таблицы и вставить в другую таблицу, но не могу устранить ее без ошибки, но не смог ее решить. Появляется пустой столбец. Попытка вставить t_vrm в вставной заявлении на sql_fix_01 t_vrm в SQL Server и его регистрационный номер транспортного средства (номерного знака)Невозможно получить значение столбца из другой таблицы в инструкции insert

varchar Но возвращает пустой столбец.

private void btnProcess_Click(object sender, EventArgs e) 
{ 
      tbl = new DataTable(); 
      tbl.Columns.Add(new DataColumn("ticket_reference", System.Type.GetType("System.String"))); 
      tbl.Columns.Add(new DataColumn("ticket_number", System.Type.GetType("System.String"))); 
      tbl.Columns.Add(new DataColumn("t_vrm", System.Type.GetType("System.String"))); 
      tbl.Columns.Add(new DataColumn("sql_fix_01", System.Type.GetType("System.String"))); 
      tbl.Columns.Add(new DataColumn("sql_fix_02", System.Type.GetType("System.String"))); 
      tbl.Columns.Add(new DataColumn("sql_fix_03", System.Type.GetType("System.String"))); 
      tbl.Columns.Add(new DataColumn("sql_fix_04", System.Type.GetType("System.String"))); 

      SqlConnection myConn = new SqlConnection(); 
      myConn.ConnectionString = stringConn; 

      SqlCommand myComm = new SqlCommand(); 
      myComm.Connection = myConn; 

      string[] tempArray = new string[this.textBox1.Lines.Length]; 
      tempArray = this.textBox1.Lines; 

      if (this.textBox1.Lines.Length == 0) 
      { 
       return; 
      } 

      myConn.Open(); 
      int ticket_number = -666; 
      string t_vrm = ""; 
      string sql_fix_01 = ""; 

      string stringDatetime = DateTime.Now.ToString("yyyyMMdd HH:mm:ss"); 
      //string stringDatetime = "20120829 17:00:00"; 

      for (int counter = 0; counter <= tempArray.Length - 1; counter++) 
      { 
       sql_fix_01 = ""; 

       t_vrm = ""; 
       ticket_number = -666; 

       if (tempArray[counter].Trim().Length > 0) 
       { 
        try 
        { 
         myComm.CommandText = "SELECT t_number, t_vrm FROM tickets WHERE t_reference='" + tempArray[counter] + "'"; 
         ticket_number = (int)myComm.ExecuteScalar(); 
         t_vrm = (string)(myComm.ExecuteScalar()).ToString(); 

МОЯ ОШИБКА в этом ROW. (t_vrm)

sql_fix_01 = "INSERT INTO [dvla] ([dvla_system_ref],[dvla_seq_no],[dvla_vrm],[dvla_due],[dvla_sent],[dvla_sent_by],[dvla_batch_no],[dvla_response_date],[dvla_query_destination]) VALUES(" + ticket_number.ToString().Trim() + ", 2 , t_vrm , '" + stringDatetime + "', NULL,'',0, NULL, 'DVLATicketLetter');"; 
        } 
        catch { } 

        if (ticket_number != -666) 
        { 
         tbl.Rows.Add(tempArray[counter], ticket_number,t_vrm, sql_fix_01, sql_fix_02, sql_fix_03, sql_fix_04); 
        } 
       } 
      } 
      myConn.Close(); 

      this.dataGridView1.DataSource = tbl; 
      this.dataGridView1.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.AllCells; 

      DataView vwExport = new DataView(tbl); 

      if (sfd.ShowDialog() == DialogResult.OK) 
      { 
       if (sfd.FileName != "") 
       { 
        btnProcess.Enabled = false; 
        Application.DoEvents(); 

        StreamWriter sw = null; 
        FileStream fs = null; 

        fs = File.Open(sfd.FileName, FileMode.Create, FileAccess.Write); 
        sw = new StreamWriter(fs, System.Text.Encoding.UTF8); 

        sw.WriteLine("USE ICPS"); 
        sw.WriteLine("GO"); 
        sw.WriteLine(" "); 
        sw.WriteLine("/* Set accounts Hold Status to ''VQ4 rescheduled' */"); 
        sw.WriteLine(" "); 


        foreach (DataRowView drv in vwExport) 
        { 
         sw.WriteLine("/* Ticket Reference: " + drv["ticket_reference"].ToString() + "/" + drv["ticket_number"].ToString() + "/" + drv["t_vrm"].ToString() + "*/"); 
         sw.WriteLine(drv["sql_fix_01"].ToString()); 
+1

Я не хочу быть слишком придирчивым, но ... Вы склонны к sql-инъекции; – Amber

+0

Я удалил sql_fix_02. мой probelm с sql_fix_01 от t_vrm. – preethi

+1

Вы проверили, отлаживается ли правильное получение t_vrm get в первую очередь? – Amber

ответ

3

Вы не можете использовать ExecuteScalar с несколькими значениями ..

myComm.CommandText = "SELECT t_number, t_vrm 
      FROM tickets WHERE t_reference='" + tempArray[counter] + "'"; 

ticket_number = (int)myComm.ExecuteScalar(); 
t_vrm = (string)(myComm.ExecuteScalar()).ToString(); 

Вам нужно будет использовать вместо DataReader ,

SqlDataReader reader = myComm.ExecuteReader(); 

// Call Read before accessing data. 
while (reader.Read()) 
{ 
    ticket_number = reader.GetInt32(0); 
    t_vrm = reader.GetString(1); 
} 

Кроме того, чтобы подтвердить, что @Amber сказал, посмотрите на Bobby Tables, вы действительно хотите, чтобы избежать dynamic SQL

+0

, так как я могу получить t_vrm без использования скаляра. – preethi

+0

'SqlDataReader', я только что обновил код. – christiandev

+0

Спасибо christiandev. Теперь он отсортирован. – preethi

0

should'nt:

...VALUES(" + ticket_number.ToString().Trim() + ", 2 , t_vrm , '" +... 

Be:

...VALUES(" + ticket_number.ToString().Trim() + ", 2 , " + t_vrm + " , '" +... 

Ваша переменная t_vrm является частью строки.

+0

Я пробовал, но он все еще пуст в столбце. Он выбирает t_number и datatime, но не t_vrm. – preethi

+0

Это из-за того, что @christiandev ответил ниже. – Abhitalks

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