解析输入文本文件执行SQL查询和结果到输出文本文件

本文关键字:文件 文本 结果 输出 查询 执行 输入 SQL | 更新日期: 2023-09-27 18:10:30

我对c#相当陌生,我正在尝试将大型机上的旧自动化过程转换为控制台。net c#应用程序。我需要获取一个输入文本文件,对其进行解析,并使用解析中的一些值来执行SQL查询,然后将结果存储在输出文本文件中。我需要按一行解析输入文件,然后执行查询,然后将部分结果写入输出文件,然后转到下一行并重复,直到输入文件结束。

我很难让它工作。我没有得到任何错误,只是一个空白的输出文件。这是一个自动的,或者将是一旦我得到它的工作,我认为我不需要担心SQL注入。

我注意到我得到一个异常:

类型为'System '的第一次异常。InvalidOperationException'在System.Data.dll中发生

这是什么意思?查询有问题吗?我根据评论的建议更新了我的代码这是我的代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading.Tasks;
using System.Data;
using System.Data.SqlClient;

namespace MainframeAuto1
{
    class Program
    {
        static void Main(string[] args)
        {
            SqlConnection con;
            SqlDataReader reader;
            SqlDataAdapter da;
            //int counter = 0;
            //Below is the input file for program
            //C:'Users'csembry'Desktop's0c119infile.txt
            try
            {
                int id;
                con = new SqlConnection(Properties.Settings.Default.connectionStr);
                //Console.WriteLine("Test");
                int counter = 0;
                string line;
                //string oline;
                //Read the file and display it line by line.
                System.IO.StreamReader file;
                file = new System.IO.StreamReader("C:''Users''csembry''Desktop''SOC110infile.txt");
                System.IO.StreamWriter ofile;
                ofile = new System.IO.StreamWriter("C:''Users''csembry''Desktop''test.txt");
                //Default value for WWAGE_SSN 
                //Will be changed late
                string CCYYQ =   "20152";
                string sql = "SELECT WWAGE_SSN, WWAGE_CCYYQ, WWAGE_SER, WWAGE_EARNS, WWAGE_LNAME, WWAGE_FNAME FROM dbo.WWAGE WHERE WWAGE_CCYYQ = @Parameter1 and WWAGE_SSN = @Parameter2 order by WWAGE_SSN";
                //using (con = new SqlConnection(Properties.Settings.Default.connectionStr)) 
                //command.Parameters.AddWithValue("@Parameter", CCYYQ);
                while ((line = file.ReadLine()) != null)
                {
                    con.Open();
                    SqlCommand cmd = new SqlCommand(sql, con);
                    //int len = line.Length;
                    //Below is the parsing of input file into string variables
                    line = line.Replace("     ", "");
                    string ssnline = line;
                    string fourdline = line;
                    string onedline = line;
                    string ssn = ssnline.Substring(0, 9);
                    string fourd = fourdline.Substring(9,4);
                    string oned = onedline.Substring(12,1);
                    string name = line.Substring(14);
                    // this is first query being executed
                    cmd.Parameters.AddWithValue("@Parameter1", CCYYQ);
                    cmd.Parameters.AddWithValue("@Parameter2", ssn);
                  SqlDataReader doit = cmd.ExecuteReader();

                while (doit.Read())
                {
                    ofile.WriteLine(String.Format("{0}",doit[0]));
                }

                }
                con.Close();
                file.Close();
                ofile.Close();
                // Suspend the screen.
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
            }
        }
    }
}

解析输入文本文件执行SQL查询和结果到输出文本文件

当处理返回的SQL Server查询时,您需要指示代码要检索的列,以及如何检索它。您发布的代码只指定了列,但没有指定如何检索它。

考虑将while循环更改为以下内容:

            string strTemp = string.Empty;
            while (doit.Read())
            {
                strTemp = doit.GetString( doit.GetOrdinal( "WWAGE_SSN" ) );
                ofile.WriteLine( strTemp );
            }

在此更改中,strTemp将加载读取器WWAGE_SSN列的字符串。只要列WWAGE_SSN是可转换为字符串的数据类型(即char[width], varchar[width]),这将起作用。然后,将返回的字符串值馈送到输出文件流。

通过使用GetOrdinal()调用,您的代码将不再容易受到所选列顺序被更改的影响。

这个代码段是调试友好的。您可以将这些代码组合成更紧凑的代码,但是当您试图从一个麻烦的返回选择中获取值时,能够轻松地逐步遍历代码以查看它在做什么是非常有用的。