2012-12-04 3 views
0

csv 파일을 삽입 문으로 묶어 데이터베이스로 변환하는 작은 프로그램을 작성하고 있습니다. 프로그램에는 데이터베이스에 대한 지식이 없기 때문에 작성된 문장은 일회성 일 뿐이며 동적 일 수 없습니다.C#에서 sql 문 생성 - 새 테이블에 tabe 값을 삽입하십시오.

이제 각각의 데이터 세트에는 고유 한 GUID가 있으며 데이터베이스에 쿼리를 실행하여 데이터 세트가 존재하는지 여부를 확인합니다. 그래서 나는이 :

sw.WriteLine("-- Determine if dataset exists from school name"); 
sw.WriteLine(string.Format(
"INSERT INTO DataSets (Guid, DataSets) VALUES ('{0}', '{1}') WHERE NOT EXISTS (SELECT * FROM DataSets WHERE DataSetName = '{1}')", 
Guid, 
DataSetName 
)); 

지금, 다음 문제는 데이터 세트에 대한 GUID가 다른 테이블의 일부에 사용되는 것입니다 (SQL 정말 내 장점되지 않습니다 내가 틀렸다면 수정하십시오) 같은 :

string sql = string.Format(
        "INSERT INTO Table1 VALUES ('{0}', '{1}', '{2}', {3}, '{4}');", 
        object.value1 
        object.value1 
        object.value1 
        object.value1 
        Guid 

'GUID를'하지만 C#에서 변수로 사용할 수 없습니다, 그것은 될 수 중 하나를 새 GUID (있는 경우 데이터베이스에 존재하지 않는 '데이터 세트') 또는 기존의 GUID (있는 경우 '데이터 세트'가 존재하며 기존 GUID 가져 오기)

그래서 다음과 같이 입력해야합니다 :

string sql = string.Format(
        "INSERT INTO Table1 (Data1, Data2, Data3, Data4) VALUES ('{0}', '{1}', '{2}', {3});", 
        object.value1 
        object.value1 
        object.value1 
        object.value1 
string sql2 = string.Format("INSERT INTO Table1 (Data5) VALUES (SELECT Guid FROM Datasets WHERE DataSetName = '{0}'); 
        Guid 
        ); 

이 방법은 좋은 방법인가요?

+0

SQL 인젝션 취약점이 있습니다. – SLaks

+0

데이터를 삽입하기 전에 쉼표를 ''로 바꾸는 함수가 있습니다. 나는 여전히 더 많은 측정을하고 있지만이 코드를 실행하기 전에 데이터를 정리해야합니다. –

+2

매개 변수를 사용해야합니다. – SLaks

답변

2

우선, 다른 사람이 지적한 것처럼 SQL 삽입을 사용할 수 있으므로 SqlCommand의 매개 변수를 사용하는 것이 더 좋습니다. 많은 예제를 찾을 수 있습니다.

그러나 코드가 csv를 삽입하기위한 코드 일 뿐이며 누군가 프로그램을 해킹하려고 시도하지 않는다면 나는 괜찮다고 말할 것입니다.

기본적으로 설명하는 내용은 정상입니다. 그러나

string sql2 = string.Format("INSERT INTO Table1 (Data5) VALUES (SELECT Guid FROM Datasets WHERE DataSetName = '{0}'); 
       Guid 
       ); 

는 먼저이 GUID는 null가

SELECT Guid FROM Datasets WHERE DataSetName = '{0}' 

다음할지 여부를 결정 새 GUID를 생성하고 삽입 반환 여부를 확인해야합니다.

가져 오기를 한 번만 수행하는 경우 GUID가 있는지 여부를 확인하지 않아도됩니다. 코드에서 guid를 만들고 SQL에 삽입하십시오. 그것은 guid이기 때문에 하나의 배치에서 동일한 guid를 작성할 확률은 실제로는 0이지만 이론적으로는 작습니다.

  • 데이터베이스에 이미있는 guid를 알 필요가없는 경우 (즉, 한 번만 가져 오기만하면 됨) 데이터베이스에 연결할 필요가 없습니다. 당신이 사용하는 모든 guid 트랙 목록을 사용할 수 있습니다.
+0

고마워요!이미 Guid가 null이 아니라는 것을 확인하고 있습니다. 코드의 첫 번째 블록이 먼저 실행되므로 null 인 경우 새 GUID를 생성합니다. 같은 이름을 가진 동일한 GUID에 의해 참조되기를 원하기 때문에 새 데이터를 기존 데이터와 일치시키는 GUID가 있는지 확인합니다. –

+0

"누군가가 프로그램을 해킹하려고 시도 할 가능성이 거의 없기 때문에"매개 변수를 사용하지 않는 것은 매우 위험한 조언입니다. 확실한 경우에도 항상 사용하는 습관을 가지십시오. –

+0

좋아요, 매개 변수 사용에 대해 살펴 보겠습니다. 몇 가지 질문 : 1.이 프로그램은 서버에 대한 액세스 권한이 없으므로 SqlConnection없이 수행 할 수 있습니까? 2. 명령 객체를 가져 와서 명령을 작성합니까 (서버로 보내지 않음)? –

관련 문제