[SQL] C #는 SQL 매개 변수 속기
SQLC #는 SQL 매개 변수 속기
나는 기록 오브젝트의 목록에있는 데이터를 복용하고 데이터베이스의 내용을 걸었습니다 :
// Processes a Record and adds it to the database
public bool addRecord(SqlConnection db, List<Record> recordsToAdd)
{
using (SqlCommand command = db.CreateCommand())
{
foreach (Record record in recordsToAdd)
{
// Set the query command text
command.CommandText = @"INSERT INTO SMDGROUP_STPRODMASTER (PRODCODE, TOTFREE, TOTPHYS, ITEMTYPE, PRODESC) VALUES ('@PRODCODE', '@TOTFREE', '@TOTPHYS', '@ITEMTYPE', '@PRODESC')";
SqlParameter param1 = new SqlParameter("@CURSTAT", record.curstat);
SqlParameter param2 = new SqlParameter("@ITEMDESC", record.itemdesc);
SqlParameter param3 = new SqlParameter("@PRODCODE", record.prodcode);
SqlParameter param4 = new SqlParameter("@TOTFREE", record.totfree);
SqlParameter param5 = new SqlParameter("@TOTPHYS", record.totphys);
SqlParameter param6 = new SqlParameter("@ITEMTYPE", record.itemtype);
SqlParameter param7 = new SqlParameter("@PRODESC", record.proddesc);
command.Parameters.Add(param1);
command.Parameters.Add(param2);
command.Parameters.Add(param3);
command.Parameters.Add(param4);
command.Parameters.Add(param5);
command.Parameters.Add(param6);
command.Parameters.Add(param7);
// Execute the query
command.ExecuteNonQuery();
}
return true;
}
}
여기 내 기록 클래스는 다음과 같습니다
class Record
{
public string curstat { get; set; }
public string itemtype { get; set; }
public string itemdesc { get; set; }
public string prodcode { get; set; }
public string proddesc { get; set; }
public string totfree { get; set; }
public string totphys { get; set; }
}
그냥 코드보고에서, 나는이 달성의 짧은 방법이 있다는 느낌을 가지고있다.
그러나 둘째로, 나는 제대로 @PARAMETER 값이 대체되고 있음을 완료 한 경우에도 확실하지 않다.
내가 명령의 내용을 보면, 여전히 @ 매개 변수를 사용하여 쿼리 문자열을 보여줍니다.
또한, 나는 command.ExecuteNonQuery ()에서이 오류를 받고 있어요 :
그래서, 내 질문은 :
해결법
-
==============================
1.당신은 더 큰 생성자가 :
당신은 더 큰 생성자가 :
command.Parameters.Add( "@CategoryName", SqlDbType.VarChar, 80).Value = "toasters";
-
==============================
2.조금 짧은 비트 코드를 만들 것입니다 방법 AddWithValue 사용 :
조금 짧은 비트 코드를 만들 것입니다 방법 AddWithValue 사용 :
command.Parameters.AddWithValue("@CURSTAT", record.curstat); //...
-
==============================
3.나는 다르게 조금을한다.
나는 다르게 조금을한다.
내가 확장 방법과 SqlParameters을 만들 수있는 정적 방법을 모두 가지고있다.
public static SqlParameter ToParam(this object v,string name){ return new SqlParameter(name,v); }
그 때 나는 같은 것을 할 :
var p = new List<SqlParameter>(); p.Add(record.curstat.ToParam("@curstat")); p.Add(record.itemdesc.ToParam("@itemdesc")); //etc... command.Parameters.AddRange(p.ToList());
-
==============================
4.문자열이나 이진 데이터는 잘립니다. 가장 가능성이 수단은 VARCHAR 필드 중 하나에 너무 많은 문자를 넣어 당신. 당신의 열 PRODDESC는 VARCHAR (50), 그리고 당신이 삽입하려는 문자열이 70 자하는 경우 즉, 당신은 그 오류를 볼 수 있습니다.
문자열이나 이진 데이터는 잘립니다. 가장 가능성이 수단은 VARCHAR 필드 중 하나에 너무 많은 문자를 넣어 당신. 당신의 열 PRODDESC는 VARCHAR (50), 그리고 당신이 삽입하려는 문자열이 70 자하는 경우 즉, 당신은 그 오류를 볼 수 있습니다.
기타는 코드의 라인을 줄일 수 있도록 매개 변수를 수행하는 다른 방법을 다루었 다.
-
==============================
5.짧은 구문의 경우, SqlParameterCollection 클래스의 AddRange 메서드를 사용할 수 있습니다. 그 뜻은:
짧은 구문의 경우, SqlParameterCollection 클래스의 AddRange 메서드를 사용할 수 있습니다. 그 뜻은:
command.Parameters.AddRange(new [] { new SqlParameter(...), new SqlParameter(...), new SqlParameter(...) });
당신이지고있어 오류 문자열 값이 테이블 열 또는 매개 변수에 맞지 않음을 나타냅니다, 그리고 잘립니다되고있다. 사용자는 데이터가 삽입되는 것에 비해 컬럼의 길이를 확인하거나 SqlParameter에 생성자의 다른 오버를 이용하여 매개 변수의 길이를 지정한다.
-
==============================
6.오류에 관해서, 그것은 즉, 귀하의 매개 변수의 길이 절단에 문제가 열을 저장할 수있는 것보다 더 이상이다. 예를 들어, 귀하의 매개 변수를 전달할 때이 문제를 해결하려면 더 구체적인 일 새로운 SqlParameter에 ( "@ MyParameter", SqlDbType.VarChar, 30).
오류에 관해서, 그것은 즉, 귀하의 매개 변수의 길이 절단에 문제가 열을 저장할 수있는 것보다 더 이상이다. 예를 들어, 귀하의 매개 변수를 전달할 때이 문제를 해결하려면 더 구체적인 일 새로운 SqlParameter에 ( "@ MyParameter", SqlDbType.VarChar, 30).
개인적으로 나는 당신의 현재는 읽을 수 그리고 작업을 수행하는 매개 변수를 추가하는 방법과 자신의 IS의 아무것도 잘못을 생각하지 않습니다. 그러나, 당신은 당신이 중 하나를 @Royi 제안 무슨으로 이동하거나 다른 방법으로 추가 매개 변수를 패키징 할 수 함수의 코드 라인의 amont을 줄이려면.
-
==============================
7.당신이 원하는 경우 다음과 같은 클래스를 사용합니다 :
당신이 원하는 경우 다음과 같은 클래스를 사용합니다 :
Class MyParam { public string name {get;set;} public object value {get;set;} }
다음은 목록라는 myParams을 가지고 할 수있는 :
foreach(var p in myParams) command.Parameters.AddWithValue(p.name, p.value);
당신은 분명히 어떻게 든 매개 변수와 값을 연결해야하고 방법은 주위에 없다. 이 같은 클래스에서 할 경우 그러나 실제로 작업을 수행하는 코드는 긴 한 줄입니다.
-
==============================
8.나는 메시지를 생각한다
나는 메시지를 생각한다
String or binary data would be truncated. The statement has been terminated.
당신의 명령 텍스트의 오류에서 오는 : 그들은 문자열 경우에도 매개 변수, 인용 할 필요가없는 SQL 쿼리에.
이와 함께 명령을 교체
command.CommandText = @"INSERT INTO SMDGROUP_STPRODMASTER (PRODCODE, TOTFREE, TOTPHYS, ITEMTYPE, PRODESC) VALUES (@PRODCODE, @TOTFREE, @TOTPHYS, @ITEMTYPE, @PRODESC)";
코드를 단축하기 위해 난 당신이 (당신의 기록 클래스 또는 헬퍼 클래스의 예를 들어) 기록 객체에서 매개 변수의 배열을 생성하는 방법 곳을 추가 한 다음 AddRange 함수를 호출 할 수 있다고 생각. 그것은해야이 기능 청소기를 유지하고 당신은 당신이 코드의 다른 부분도 사용할 수 있습니다.
-
==============================
9.이것은 나를 위해 일한 :
이것은 나를 위해 일한 :
comando.Parameters.Add( "@EmailAddress", SqlDbType.VarChar).Value = EmailAddress;
from https://stackoverflow.com/questions/8148815/c-sharp-sqlparameters-short-hand by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] 엔티티 프레임 워크는 2100 매개 변수 제한을 명중 (0) | 2020.07.04 |
---|---|
[SQL] SQL에서 선택 특정 행 번호 [중복] (0) | 2020.07.04 |
[SQL] SQL 시간이 여러 중복 간격에서 경과 찾을 수 (0) | 2020.07.04 |
[SQL] 이 행의 위치를 포함하도록 업데이트 칼럼 (0) | 2020.07.04 |
[SQL] 삽입 여기서 일하지 않는 무시 내 테이블에서 중복 레코드를 방지하는 방법 (0) | 2020.07.04 |