C# 读取文件、报告错误并将数据插入SQL Server数据库
下面的代码读取文本文件,格式化它,显示任何错误,并将数据插入SQL Server数据库。我以前用Visual Basic编写了下面的代码,现在我正试图在C#中重写代码,但它不起作用 我无法获取指示插入数据库的字段:我正在尝试获取没有错误的记录以插入数据库,即使这些记录与其他行有错误 这是我一件一件地做的项目,因为我还在学习这些东西,所以请原谅我的无知。数据库部分似乎很好,所以我没有发布它,但如果需要,我可以发布 文件中的类:C# 读取文件、报告错误并将数据插入SQL Server数据库,c#,sql-server,C#,Sql Server,下面的代码读取文本文件,格式化它,显示任何错误,并将数据插入SQL Server数据库。我以前用Visual Basic编写了下面的代码,现在我正试图在C#中重写代码,但它不起作用 我无法获取指示插入数据库的字段:我正在尝试获取没有错误的记录以插入数据库,即使这些记录与其他行有错误 这是我一件一件地做的项目,因为我还在学习这些东西,所以请原谅我的无知。数据库部分似乎很好,所以我没有发布它,但如果需要,我可以发布 文件中的类: using System; using System.Collecti
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Linq;
using System.Text;
using System.Data.SqlClient;
using System.Configuration;
namespace ConsoleApplication1
{
class ClsMethods
{
public class MemberInfo
{
public static string MemberPhone;
public static string MemberName;
public static string MemberAddr1;
public static string MemberAddr2;
public static string MemberCity;
public static string MemberState;
public static string MemberZip;
}
public class ErrLog
{
public static int RowNum;
public static List<string> Err;
public ErrLog(int row)
{
RowNum = row;
Err = new List<string>();
}
public ErrLog()
{
Err = new List<string>();
}
}
}
}
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Linq;
using System.Text;
using System.Data.SqlClient;
using System.Configuration;
using System.IO;
namespace ConsoleApplication1
{
class Program
{
public static class MainModule
{
static List<ClsMethods.ErrLog> ErrList;
public static void Main()
{
string strFilename = null;
FileInfo fiFile = default(FileInfo);
StreamReader srData = default(StreamReader);
string strRecord = "";
List<ClsMethods.MemberInfo> MbrList = default(List<ClsMethods.MemberInfo>);
ClsMethods.MemberInfo MbrInfo = default(ClsMethods.MemberInfo);
int successCount = 0;
int failedCount = 0;
int totalCount = 0;
ErrList = new List<ClsMethods.ErrLog>();
strFilename = "C:\\EMP\\Member.csv";
fiFile = new FileInfo(strFilename);
if (fiFile.Exists)
{
if (fiFile.Length > 0)
{
MbrList = new List<ClsMethods.MemberInfo>();
srData = new StreamReader(strFilename);
while (srData.Peek() > 0)
{
try
{
strRecord = srData.ReadLine().Replace("\"", "");
totalCount = totalCount + 1;
String[] rec = strRecord.Split(",".ToCharArray());
if ((ValidateRow(rec, totalCount)))
{
MbrInfo = new ClsMethods.MemberInfo();
ClsMethods.MemberInfo.MemberPhone = rec[0];
ClsMethods.MemberInfo.MemberName = rec[1];
ClsMethods.MemberInfo.MemberAddr1 = rec[2];
ClsMethods.MemberInfo.MemberAddr2 = rec[3];
ClsMethods.MemberInfo.MemberCity = rec[4];
ClsMethods.MemberInfo.MemberState = rec[5];
ClsMethods.MemberInfo.MemberZip = rec[6];
MbrList.Add(MbrInfo);
}
}
catch (Exception ex)
{
Console.WriteLine("READ: " + ex.Message);
srData.Close();
srData.Dispose();
}
Console.WriteLine(strRecord);
}
foreach (ClsMethods.MemberInfo emp in MbrList)
{
if ((ClsDatabase.InsertMemberInfo(MbrInfo)))
{
successCount = successCount + 1;
}
else
{
failedCount = failedCount + 1;
}
}
Console.WriteLine("Total rows: {0} ", totalCount);
Console.WriteLine("Records without Errors: {0} ", MbrList.Count);
Console.WriteLine("Records with errors: {0} ", ErrList.Count);
Console.WriteLine("Inserted successfully: " + successCount.ToString());
Console.WriteLine("Failed: " + failedCount.ToString());
if ((ErrList.Count > 0))
{
Console.WriteLine("If you want to display errors press D. If you want to store errors in log file press F.");
ConsoleKeyInfo cki = default(ConsoleKeyInfo);
cki = Console.ReadKey();
Console.WriteLine();
string res = "";
res = cki.Key.ToString(res.ToUpper());
if ((res == "D"))
{
DisplayErrors();
}
else if ((res == "F"))
{
WriteErrorsToFile();
}
}
}
else
{
Console.WriteLine("File " + strFilename + " is empty");
}
}
else
{
Console.WriteLine("File " + strFilename + " doesn't exists");
}
Console.WriteLine("Program End. Press any key to exit");
Console.ReadKey();
Environment.Exit(0);
}
public static void DisplayErrors()
{
foreach (ClsMethods.ErrLog err in ErrList)
{
foreach (string errDescr in ClsMethods.ErrLog.Err)
{
Console.WriteLine("Line " + ClsMethods.ErrLog.RowNum.ToString() + ": " + errDescr);
}
}
}
public static void WriteErrorsToFile()
{
string path = "C:\\Log\\log.txt";
// Delete the file if it exists.
if (File.Exists(path))
{
File.Delete(path);
}
using (StreamWriter outfile = new StreamWriter(File.Create(path)))
{
foreach (ClsMethods.ErrLog err in ErrList)
{
foreach (string errDescr in ClsMethods.ErrLog.Err)
{
outfile.WriteLine("Line " + ClsMethods.ErrLog.RowNum.ToString() + ": " + errDescr);
}
}
}
}
public static bool ValidateRow(string[] rec, int rowIndex)
{
ClsMethods.ErrLog Err = new ClsMethods.ErrLog();
if ((rec.Length != 7))
{
ClsMethods.ErrLog.Err.Add("Wrong number of values in row");
}
else
{
rec[0] = rec[0].Replace("-", "");
if ((string.IsNullOrEmpty(rec[0])))
{
ClsMethods.ErrLog.Err.Add("Phone is empty");
}
if ((string.IsNullOrEmpty(rec[1])))
{
ClsMethods.ErrLog.Err.Add("Name is empty");
}
if ((string.IsNullOrEmpty(rec[2])))
{
ClsMethods.ErrLog.Err.Add("Address is empty");
}
if ((string.IsNullOrEmpty(rec[4])))
{
ClsMethods.ErrLog.Err.Add("City is empty");
}
if ((string.IsNullOrEmpty(rec[5])))
{
ClsMethods.ErrLog.Err.Add("State is empty");
}
if ((string.IsNullOrEmpty(rec[6])))
{
ClsMethods.ErrLog.Err.Add("Zip is empty");
}
}
if ((ClsMethods.ErrLog.Err.Count > 0))
{
ClsMethods.ErrLog.RowNum = rowIndex;
ErrList.Add(Err);
return false;
}
else
{
return true;
}
}
}
}
}
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Linq;
using System.Text;
using System.Data.SqlClient;
using System.Configuration;
namespace ConsoleApplication1
{
class ClsDatabase
{
public static SqlConnection GetConnection()
{
SqlConnection InitCnt = null;
InitCnt = new SqlConnection();
InitCnt.ConnectionString = "Server=MyDB;database=Example;Trusted_Connection=true;";
try
{
InitCnt.Open();
}
catch (Exception ex)
{
InitCnt.Close();
InitCnt.Dispose();
}
return InitCnt;
}
public static bool InsertMemberInfo(ClsMethods.MemberInfo MbrInfo)
{
SqlConnection InitCnt = default(SqlConnection);
SqlCommand InitCmd = default(SqlCommand);
InitCnt = GetConnection();
if ((InitCnt != null))
{
InitCmd = new SqlCommand();
InitCmd.Connection = InitCnt;
InitCmd.CommandText = "uspInsertMemberInformation";
InitCmd.CommandType = CommandType.StoredProcedure;
InitCmd.Parameters.Add(new SqlParameter("@MemberPhone", SqlDbType.NVarChar, 10));
InitCmd.Parameters["@MemberPhone"].Direction = ParameterDirection.Input;
InitCmd.Parameters["@MemberPhone"].Value = ClsMethods.MemberInfo.MemberPhone;
InitCmd.Parameters.Add(new SqlParameter("@MemberName", SqlDbType.NVarChar, 50));
InitCmd.Parameters["@MemberName"].Value = ClsMethods.MemberInfo.MemberName;
InitCmd.Parameters["@MemberName"].Value = ClsMethods.MemberInfo.MemberName;
InitCmd.Parameters.Add(new SqlParameter("@MemberAddr1", SqlDbType.NVarChar, 30));
InitCmd.Parameters["@MemberAddr1"].Direction = ParameterDirection.Input;
InitCmd.Parameters["@MemberAddr1"].Value = ClsMethods.MemberInfo.MemberAddr1;
InitCmd.Parameters.Add(new SqlParameter("@MemberAddr2", SqlDbType.NVarChar, 30));
InitCmd.Parameters["@MemberAddr2"].Direction = ParameterDirection.Input;
InitCmd.Parameters["@MemberAddr2"].Value = ClsMethods.MemberInfo.MemberAddr2;
InitCmd.Parameters.Add(new SqlParameter("@MemberCity", SqlDbType.NVarChar, 20));
InitCmd.Parameters["@MemberCity"].Direction = ParameterDirection.Input;
InitCmd.Parameters["@MemberCity"].Value = ClsMethods.MemberInfo.MemberCity;
InitCmd.Parameters.Add(new SqlParameter("@MemberState", SqlDbType.NChar, 2));
InitCmd.Parameters["@MemberState"].Direction = ParameterDirection.Input;
InitCmd.Parameters["@MemberState"].Value = ClsMethods.MemberInfo.MemberState;
InitCmd.Parameters.Add(new SqlParameter("@MemberZip", SqlDbType.NVarChar, 9));
InitCmd.Parameters["@MemberZip"].Direction = ParameterDirection.Input;
InitCmd.Parameters["@MemberZip"].Value = ClsMethods.MemberInfo.MemberZip;
try
{
InitCmd.ExecuteNonQuery();
}
catch (Exception ex)
{
return false;
}
finally
{
InitCmd.Parameters.Clear();
InitCnt.Close();
}
}
return true;
}
}
}
这里有一些非常奇特的东西:
只包含类,不使用;移除它ClsMethods
仅包含MemberInfo
字段,因此每个实例必须始终包含相同的数据静态
只包含一个静态字段,因此每个实例始终包含相同的数据ErrLog
无意义地将一组变量设置为Main
,它总是default
,这是多余的。你为什么这么做null
也是冗余的,应该删除main模块
- 所有变量都是全局变量,这是不必要的,也是有风险的
MbrInfo=newclsmethods.MemberInfo()代码>是无用的,因为所有字段都是静态的,您只需覆盖已有的内容
将始终按文件中记录的次数传递上次记录。我猜您想要ClsDatabase.InsertMemberInfo(MbrInfo)
。看看为什么球是坏的ClsDatabase.InsertMemberInfo(emp)
忽略您传递的参数,并对每个参数使用单个静态值InsertMemberInfo
- 默认的
是SqlParameter.Direction
,您不必重置它Input
public class MemberInfo
{
public string Phone;
public string Name;
public string Addr1;
public string Addr2;
public string City;
public string State;
public string Zip;
}
然后在Main
中,您可以调用:
MemberInfo mi = new MemberInfo();
mi.Phone = rec[0];
mi.Name = rec[1];
mi.Addr1 = rec[2];
mi.Addr2 = rec[3];
mi.City = rec[4];
mi.State = rec[5];
mi.Zip = rec[6];
MbrList.Add(mi);
您可以使用单词Err
来表示类、日志和实例变量。这很令人困惑。我建议如下:
public class ErrLog
{
public int RowNum;
public List<string> Messages;
public ErrLog(int row)
: base()
{
RowNum = row;
}
public ErrLog()
{
Messages = new List<string>();
}
}
不要这样做:
try
{
InitCmd.ExecuteNonQuery();
}
catch (Exception ex)
{
return false;
}
InitCmd.ExecuteNonQuery();
这将放弃该过程失败的原因。只要这样做:
try
{
InitCmd.ExecuteNonQuery();
}
catch (Exception ex)
{
return false;
}
InitCmd.ExecuteNonQuery();
例外情况。使用它们。代码中还有一些奇怪的东西;从我展示的内容开始。正如我提到的,我仍在学习这方面的知识,所以请耐心点。那么我可以建议你先读一本书吗?这里的错误数量对于程序员第一次阅读C#来说是一个耻辱。这是核心内容。在编写一行代码之前,请先阅读一下langauge规范。谢谢,Dour,我还有其他问题,但将在另一个线程中发布代码。