我是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);
}
}
}
}
答案 0 :(得分:0)
在处理返回的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()
调用,您的代码将不再容易受到更改所选列顺序的影响。
此代码段是调试友好的。您可以将它组合成更紧凑的代码,但是当您尝试从麻烦的返回选择中获取值时,能够轻松地逐步执行代码以查看它正在执行的操作非常有用。