주어진 네트워크 디렉토리 내의 모든 txt 문서를 구문 분석하고 SQL 서버 db로 데이터를 가져 오는 C# 응용 프로그램이 있습니다. DBType.Decimal (그리고 값은 일반적으로 공백이 아닌 파일에서 0 임)으로 호출되는 열에 몇 개의 공백이 있어야 할 때 모든 것이 1800 번째 파일까지 순조롭게 순항 중이었습니다. 그래서이 오류가 발생했습니다. "nvarchar를 10 진수로 변환 할 수 없습니다." 나는이 문제가있는 라인을 건너 뛰도록 앱에 어떻게 말할 수 있을지 궁금하다. 아마 심지어 그냥 열 유형을 varchar로 변경할 수 있습니다. tho 값은 숫자입니다 (이 문제를 만들 수 있습니까?) 어떤 도움을 주셔서 감사합니다! 당신은 아마 데이터베이스에 0.0의 기본 값을 정의하거나 입력을 확인하고 0.0로 공백을 대체 할 수 있도록SQL 오류 - nvarchar를 십진수로 변환 할 수 없습니다.
using System;
using System.Data;
using System.Data.SQLite;
using System.IO;
using System.Text.RegularExpressions;
using System.Threading;
using System.Collections.Generic;
using System.Linq;
using System.Data.SqlClient;
namespace JohnDeereCMMDataParser
{
internal class Program
{
public static List<string> GetImportedFileList()
{
List<string> ImportedFiles = new List<string>();
using (SqlConnection connect = new SqlConnection(@"Server=FRXSQLDEV;Database=RX_CMMData;Integrated Security=YES"))
{
connect.Open();
using (SqlCommand fmd = connect.CreateCommand())
{
fmd.CommandText = @"SELECT FileName FROM CMMData;";
fmd.CommandType = CommandType.Text;
SqlDataReader r = fmd.ExecuteReader();
while (r.Read())
{
ImportedFiles.Add(Convert.ToString(r["FileName"]));
}
}
}
return ImportedFiles;
}
private static void Main(string[] args)
{
Console.Title = "John Deere CMM Data Parser";
Console.WriteLine("Preparing CMM Data Parser... done");
Console.WriteLine("Scanning for new CMM data...");
Console.ForegroundColor = ConsoleColor.Gray;
using (SqlConnection con = new SqlConnection(@"Server=FRXSQLDEV;Database=RX_CMMData;Integrated Security=YES"))
{
con.Open();
using (SqlCommand insertCommand = con.CreateCommand())
{
Console.WriteLine("Connecting to SQL server...");
SqlCommand cmdd = con.CreateCommand();
string[] files = Directory.GetFiles(@"C:\Documents and Settings\js91162\Desktop\CMM WENZEL\", "*_*_*.txt", SearchOption.AllDirectories);
List<string> ImportedFiles = GetImportedFileList();
insertCommand.Parameters.Add(new SqlParameter("@FeatType", DbType.String));
insertCommand.Parameters.Add(new SqlParameter("@FeatName", DbType.String));
insertCommand.Parameters.Add(new SqlParameter("@Axis", DbType.String));
insertCommand.Parameters.Add(new SqlParameter("@Actual", DbType.Decimal));
insertCommand.Parameters.Add(new SqlParameter("@Nominal", DbType.Decimal));
insertCommand.Parameters.Add(new SqlParameter("@Dev", DbType.Decimal));
insertCommand.Parameters.Add(new SqlParameter("@TolMin", DbType.Decimal));
insertCommand.Parameters.Add(new SqlParameter("@TolPlus", DbType.Decimal));
insertCommand.Parameters.Add(new SqlParameter("@OutOfTol", DbType.Decimal));
foreach (string file in files.Except(ImportedFiles))
{
var FileNameExt1 = Path.GetFileName(file);
cmdd.Parameters.Clear();
cmdd.Parameters.Add(new SqlParameter("@FileExt", FileNameExt1));
cmdd.CommandText =
@"
IF (EXISTS (SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'RX_CMMData' AND TABLE_NAME = 'CMMData')) BEGIN SELECT COUNT(*) FROM CMMData WHERE FileName = @FileExt; END";
int count = Convert.ToInt32(cmdd.ExecuteScalar());
con.Close();
con.Open();
if (count == 0)
{
Console.WriteLine("Preparing to parse CMM data for SQL import...");
if (file.Count(c => c == '_') > 5) continue;
insertCommand.CommandText =
@"
INSERT INTO CMMData (FeatType, FeatName, Axis, Actual, Nominal, Dev, TolMin, TolPlus, OutOfTol, PartNumber, CMMNumber, Date, FileName)
VALUES (@FeatType, @FeatName, @Axis, @Actual, @Nominal, @Dev, @TolMin, @TolPlus, @OutOfTol, @PartNumber, @CMMNumber, @Date, @FileName);";
string FileNameExt = Path.GetFullPath(file);
string RNumber = Path.GetFileNameWithoutExtension(file);
int index2 = RNumber.IndexOf("~");
Match RNumberE = Regex.Match(RNumber, @"^(R|L)\d{6}(COMP|CRIT|TEST|SU[1-9])(?=_)", RegexOptions.IgnoreCase);
Match RNumberD = Regex.Match(RNumber, @"(?<=_)\d{3}[A-Z]\d{4}|\d{3}[A-Z]\d\w\w\d(?=_)", RegexOptions.IgnoreCase);
Match RNumberDate = Regex.Match(RNumber, @"(?<=_)\d{8}(?=_)", RegexOptions.IgnoreCase);
string RNumE = Convert.ToString(RNumberE);
string RNumD = Convert.ToString(RNumberD);
if (RNumberD.Value == @"") continue;
if (RNumberE.Value == @"") continue;
if (RNumberDate.Value == @"") continue;
if (index2 != -1) continue;
DateTime dateTime = DateTime.ParseExact(RNumberDate.Value, "yyyyMMdd", Thread.CurrentThread.CurrentCulture);
string cmmDate = dateTime.ToString("dd-MMM-yyyy");
string[] lines = File.ReadAllLines(file);
bool parse = false;
foreach (string tmpLine in lines)
{
string line = tmpLine.Trim();
if (!parse && line.StartsWith("Feat. Type,"))
{
parse = true;
continue;
}
if (!parse || string.IsNullOrEmpty(line))
{
continue;
}
Console.WriteLine(tmpLine);
foreach (SqlParameter parameter in insertCommand.Parameters)
{
parameter.Value = null;
}
string[] values = line.Split(new[] { ',' });
for (int i = 0; i < values.Length - 1; i++)
{
if (i = "" || i = null) continue;
SqlParameter param = insertCommand.Parameters[i];
if (param.DbType == DbType.Decimal)
{
decimal value;
param.Value = decimal.TryParse(values[i], out value) ? value : 0;
}
else
{
param.Value = values[i];
}
}
insertCommand.Parameters.Add(new SqlParameter("@PartNumber", RNumE));
insertCommand.Parameters.Add(new SqlParameter("@CMMNumber", RNumD));
insertCommand.Parameters.Add(new SqlParameter("@Date", cmmDate));
insertCommand.Parameters.Add(new SqlParameter("@FileName", FileNameExt));
insertCommand.ExecuteNonQuery();
insertCommand.Parameters.RemoveAt("@PartNumber");
insertCommand.Parameters.RemoveAt("@CMMNumber");
insertCommand.Parameters.RemoveAt("@Date");
insertCommand.Parameters.RemoveAt("@FileName");
}
}
}
Console.WriteLine("CMM data successfully imported to SQL database...");
}
con.Close();
}
}
}
}
공백은 db에 null로 남겨 두어야합니다. 0.0은 실제 값입니다. –
제 생각에는 0.0을 강제로 사용하는 것이 좋습니다. 어떻게 할 수 있습니까? –