无法从insert语句中的不同表中检索列值

时间:2013-11-26 11:09:32

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

我正在尝试从另一个表中检索列值并插入另一个表但无法解决它没有错误但无法解决它。出现空列。尝试在t_vrm t_vrm上的插入语句中插入sql_fix_01是SQL Server中的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();

我的错误就在这条路上。( 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());

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

Should'nt:

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

是:

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

您的t_vrm变量是字符串的一部分。