在多个选择的状态上运行参数化查询

时间:2016-03-31 09:47:01

标签: c# visual-foxpro

我有一段代码用于使用新数据更新Foxpro表,但是为了获取这些数据,我需要运行多个select语句。我关于如何做到这一点的理论是使用参数化查询,但我现在收到错误

  

索引超出了数组的范围

我认为这是因为我有多个SELECT语句,但由于这些表之间没有链接,因此我无法通过连接运行它。

enter image description here

以下是连接字符串和原始Select语句

using (var importConnection = new OleDbConnection(
           connectionString: @"Provider=vfpoledb.1;
           Exclusive=false;
           data source=C:\Users\Joshua.cameron\Desktop\PCHomesImportTestBlank\PCHomesServer\DATABASE\pchomes.dbc")
      )
        using (OleDbCommand CodeChange = new OleDbCommand(
               @"select NUM        
                 from SYSTEMNUMBERS; 
                 select PROPCODE from PROPERTY order by PROPCODE", importConnection))

要调用和更新的代码。

importConnection.Open();

            Console.WriteLine("Visual Foxpro connection open");

            // Initiate the reader to SQL
            var exportReader = CodeChange.ExecuteReader();

            // Start reading
            while (exportReader != null && exportReader.Read())
            {
                // Set parameter values whilst reading from SQL
                Int32 currentNum = Int32.Parse(exportReader.GetInt32(0).ToString());
                string propcode = exportReader.GetValue(1).ToString();
                currentNum = currentNum + 1;
                string padprop = currentNum.ToString().PadLeft(3);
                string propcode2 = "BIDME_" + padprop;
                // insert into VFP
                var propins = new OleDbCommand(@"update PROPERTY set PROPCODE=" + propcode2 + "where PROPCODE=" + propcode);
                var clientins = new OleDbCommand(@"update CLIENT set PROPCODET="+ propcode2 + "where PROPCODET=" + propcode);
                try
                {
                    propins.ExecuteNonQuery();
                }
                catch (Exception p)
                {
                    Console.Write("Error!");
                    Console.Write(p);
                    Console.Read();
                }
                try
                {
                    clientins.ExecuteNonQuery();
                }
                catch (Exception c)
                {
                    Console.Write("Error!");
                    Console.Write(c);
                    Console.Read();
                }


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

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

1 个答案:

答案 0 :(得分:1)

错误的确切原因是尝试读取DataReader索引1处的字段的行。您似乎假设您有两个字段,因为您有两个选择。但这不是OleDbDataReader的工作原理。您的命令生成两组不同的数据,每组只有一个字段。第一个选择产生第一个结果,这是您循环的集合。

您无法将两个结果连接在一起,并在同一个循环中使用它们的值。首先需要使用所有第一个结果,然后使用OleDbDataReader的NextResult方法传递给第二个结果,并启动另一个调用Read()的循环。

警告我不确定visual-foxpro提供程序是否支持同一命令中的多个select语句。如果没有,那么你没有任何选择,只能发出两个单独的命令。

但是,查看代码时,似乎每个表的记录数相同,并且两个表之间没有明显的关系。
在这种情况下(并假设您没有大型结果集要处理)我可以简单地加载两个数据表,然后使用两个表的DataRows处理您的更新

using (var importConnection = new OleDbConnection(....))
using (OleDbCommand CodeChange = new OleDbCommand(
   @"select NUM from SYSTEMNUMBERS; 
    select PROPCODE from PROPERTY order by PROPCODE", importConnection))
{
    importConnection.Open();
    DataTable sysNum = new DataTable();
    DataTable props = new DataData();
    Console.WriteLine("Visual Foxpro connection open");
    var exportReader = CodeChange.ExecuteReader();
    sysNum.Load(exportReader);
    exportReader.NextResult();
    props.Load(exportReader);
    for (int x = 0; x < sysNum.Rows.Count; x++)
    {
        // Set parameter values whilst reading from SQL
        Int32 currentNum = Int32.Parse(sysNum.Rows[i][0]);
        string propcode = props.Rows[i][0].ToString();

        .... continue with your current code ....
        .... but remove this part.....
//            try
//            {
//                CodeChange.ExecuteNonQuery();
//            }
//            catch (Exception e)
//            {
//                Console.Write("Error Writing to database");
//                Console.Write(e);
//                Console.ReadKey();
//            }


    }
}

// done
Console.WriteLine("Complete!");