0
도와주세요. 나는 SQL 데이터베이스에 txt 파일을로드 할이 작은 응용 프로그램을 가지고 있고 그것은 sqlite와 잘 작동합니다. SQL로 이식 할 때 '매개 변수가 이미 선언되었습니다'오류가 발생했습니다. 누군가이 코드를 재구성하는 데 도움을 줄 수 있다면 좋습니다! 파일 이름에서 가져온되는 하단에있는 PARTNUMBER, CMMNumber, 날짜, 등 내가 옆에있는 테이블에 필요 - 나는 .. 루프 또는 뭔가 외부의 매개 변수 정의를 얻을 수 참고루프에서 C# SQL 매개 변수 오류
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 Import;";
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)
{
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\", "R.txt*", SearchOption.AllDirectories);
insertCommand.Parameters.Add(new SqlParameter("@FeatType", DbType.String));
insertCommand.Parameters.Add(new SqlParameter("@FeatName", DbType.String));
insertCommand.Parameters.Add(new SqlParameter("@Value", 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));
List<string> ImportedFiles = GetImportedFileList();
foreach (string file in files.Except(ImportedFiles))
{
var FileNameExt1 = Path.GetFileName(file);
cmdd.Parameters.Add(new SqlParameter("@FileExt", FileNameExt1));
cmdd.CommandText =
@"
IF (EXISTS (SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'RX_CMMData' AND TABLE_NAME = 'Import')) BEGIN SELECT COUNT(*) FROM Import WHERE FileName = @FileExt; END";
int count = Convert.ToInt32(cmdd.ExecuteScalar());
con.Close();
con.Open();
if (count == 0)
{
Console.WriteLine("Parsing CMM data for SQL database... Please wait.");
insertCommand.CommandText =
@"
INSERT INTO Import (FeatType, FeatName, Value, Actual, Nominal, Dev, TolMin, TolPlus, OutOfTol, PartNumber, CMMNumber, Date, FileName)
VALUES (@FeatType, @FeatName, @Value, @Actual, @Nominal, @Dev, @TolMin, @TolPlus, @OutOfTol, @PartNumber, @CMMNumber, @Date, @FileName);";
string FileNameExt = Path.GetFullPath(file);
string RNumber = Path.GetFileNameWithoutExtension(file);
string RNumberE = RNumber.Split('_')[0];
string RNumberD = RNumber.Split('_')[1];
string RNumberDate = RNumber.Split('_')[2];
DateTime dateTime = DateTime.ParseExact(RNumberDate, "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++)
{
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", RNumberE));
insertCommand.Parameters.Add(new SqlParameter("@CMMNumber", RNumberD));
insertCommand.Parameters.Add(new SqlParameter("@Date", cmmDate));
insertCommand.Parameters.Add(new SqlParameter("@FileName", FileNameExt));
//
insertCommand.ExecuteNonQuery();
}
}
Console.WriteLine("CMM data successfully imported to SQL database...");
}
con.Close();
}
}
}
}
필요 각각의 기록. 당신이 어떤
insertCommand.Parameters.Add();
호출을하기 전에 명령 개체에 대한
내가 insertCommand.Parameters.Clear()를 수행하면 코드가 실행되지만 각 txt 문서의 첫 번째 행만 db에 추가됩니다. ??? –
@jake, 두 번째 반복이 시작될 때 코드에 오류가 발생했기 때문에 이전에는 알지 못했던 루프에 문제가있는 것처럼 들립니다. Parameters.Clear()는 잘못된 위치에 놓지 않는 한 코드가 실패하지 않도록합니다. 디버거에서 코드를 실행하고 코드 흐름 및 로컬 변수 값을 검사하기 시작하고 루프가 일찍 종료 될 수있는 이유를 찾으십시오. – slugster
코드가 더 이상 실패하지 않으며 각 파일의 모든 줄을 더 이상 통과하지 않습니다. (그것은 sqlite와 함께했다.) 이제는 완료되었지만 db를 확인할 때 각 파일의 첫 줄에있는 부품 번호와 데이터 만 추가되었다. 이상한 거래 ... 이해가 되니? –