【问题标题】:Running parameterised queries on multiple select statments在多个选择语句上运行参数化查询
【发布时间】:2016-03-31 09:47:00
【问题描述】:

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

索引超出了数组的范围

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

下面是连接字符串和原来的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();
        }

【问题讨论】:

  • 两张表是什么关系? PROPERTY 表中的每条记录在 SYSTEMNUMBERS 中都有记录吗?
  • 约书亚,你需要更好地解释它,你想要达到的目标。检查您的代码几乎不可能理解它。即使它们没有任何关系,您也可以加入两个表,但我认为这不是您的意思。您可以改为将数据获取到本地并使用它们的行位置“加入”(.Zip)它们(您可以通过使用 VFP 的 recno() 函数来做到这一点,只有在单个表上使用但不信任它时才能信任它更好)。如果您可以对数据和您想要实现的目标进行采样,我们可以提供更好的帮助。评论不允许多写:(
  • 道歉。本质上,有两个 VFP 表已经填充了数据;这些是属性和客户表。我要更新的每个表中都有一列:PROPERTY 中的 PROPCODE 和 CLIENT 中的 PROPCODET,这两列连接了我需要将这两个记录更新为代码中定义的新值“Propcode2”的两个表。 SYSTEMNUMBERS 对此并不重要,因为我可以在必要时手动定义。
  • 但这还不够解释,检查你的代码,还有数据类型不兼容。恐怕您需要将表格作为列表和您想要的结果进行采样。否则,看起来每个表只有一个更新命令就可以了。

标签: c# visual-foxpro


【解决方案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!");

【讨论】:

  • Steve,您的代码不适用于 VFP,分号是命令继续符,VFP 无法理解您的意思。它也不支持多个结果集。如果他甚至需要进行选择,它也不清楚。
  • @CetinBasoz 在这里肯定有很多混乱......我将等待 OP 的明确解释
猜你喜欢
  • 2014-07-24
  • 1970-01-01
  • 2011-01-03
  • 2013-11-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-01
  • 2022-01-09
相关资源
最近更新 更多