Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/266.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在多个select语句上运行参数化查询_C#_Visual Foxpro - Fatal编程技术网

C# 在多个select语句上运行参数化查询

C# 在多个select语句上运行参数化查询,c#,visual-foxpro,C#,Visual Foxpro,我有一段代码,用于用新数据更新Foxpro表,但是为了获得这些数据,我需要运行多个select语句。我的理论是使用参数化查询,但是现在我收到了错误 索引超出了数组的边界 我假设这是因为我有多个SELECT语句,但是我不能用join运行它,因为这些表之间没有链接 下面是连接字符串和原始Select语句 using (var importConnection = new OleDbConnection( connectionString: @"Provider=vfpoled

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

索引超出了数组的边界

我假设这是因为我有多个SELECT语句,但是我不能用join运行它,因为这些表之间没有链接

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

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

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

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

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

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!");
使用(var importConnection=new OleDbConnection(..)
使用(OleDbCommand CodeChange=新OleDbCommand)(
@“从SystemNumber中选择NUM;
按PROPCODE(导入连接)从属性顺序中选择PROPCODE
{
importConnection.Open();
DataTable sysNum=新DataTable();
DataTable props=新的DataData();
Console.WriteLine(“Visual Foxpro连接打开”);
var exportReader=CodeChange.ExecuteReader();
sysNum.Load(exportReader);
exportReader.NextResult();
道具加载(exportReader);
对于(int x=0;x
这两个表之间的关系是什么?属性表中的每条记录都有SystemNumber中的记录吗?Joshua,你需要更好地解释一下,你想要实现什么。通过检查代码几乎不可能理解它。您可以连接两个表,即使它们没有任何关系,但我认为这不是您的意思。相反,您可以将数据获取到本地,并使用它们的行位置“连接”(.Zip)它们(您可以通过使用VFP的recno()函数来实现这一点,只有在单个表上使用时才可以信任该函数,但最好不要信任它)。如果您能对您的数据进行采样,并了解您想要实现的目标,我们将提供更好的帮助。注释不允许写入更多内容:(抱歉。本质上,有两个VFP表已经填充了数据;它们是属性表和客户端表。每个表中都有一列我要更新:property中的PROPCODE和client中的PROPCODET,这两列连接了我需要将这两个记录更新为新值的两个表“Propcode2"在代码中定义。SYSTEMNUMBERS对此并不重要,因为我可以在必要时手动定义。但这仍然不够解释,请检查代码,还存在数据类型不兼容的问题。我担心您需要将表作为列表和所需结果进行采样。否则,每个表只需一个更新命令即可d do.Steve,你的代码不能与VFP一起使用,分号是一个命令延续字符,VFP不会理解你的意思。它也不支持多个结果集。而且它还不清楚,如果他甚至需要进行选择的话。@CetinBasoz这里肯定有很多混乱……我将等待OP的明确解释