解析输入文本文件执行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 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()
调用,您的代码将不再容易受到所选列顺序被更改的影响。
这个代码段是调试友好的。您可以将这些代码组合成更紧凑的代码,但是当您试图从一个麻烦的返回选择中获取值时,能够轻松地逐步遍历代码以查看它在做什么是非常有用的。