복붙노트

[SQL] C #는 SQL 매개 변수 속기

SQL

C #는 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. ==============================

    1.당신은 더 큰 생성자가 :

    당신은 더 큰 생성자가 :

     command.Parameters.Add(
        "@CategoryName", SqlDbType.VarChar, 80).Value = "toasters";
    
  2. ==============================

    2.조금 짧은 비트 코드를 만들 것입니다 방법 AddWithValue 사용 :

    조금 짧은 비트 코드를 만들 것입니다 방법 AddWithValue 사용 :

    command.Parameters.AddWithValue("@CURSTAT", record.curstat);
    //...
    
  3. ==============================

    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. ==============================

    4.문자열이나 이진 데이터는 잘립니다. 가장 가능성이 수단은 VARCHAR 필드 중 하나에 너무 많은 문자를 넣어 당신. 당신의 열 PRODDESC는 VARCHAR (50), 그리고 당신이 삽입하려는 문자열이 70 자하는 경우 즉, 당신은 그 오류를 볼 수 있습니다.

    문자열이나 이진 데이터는 잘립니다. 가장 가능성이 수단은 VARCHAR 필드 중 하나에 너무 많은 문자를 넣어 당신. 당신의 열 PRODDESC는 VARCHAR (50), 그리고 당신이 삽입하려는 문자열이 70 자하는 경우 즉, 당신은 그 오류를 볼 수 있습니다.

    기타는 코드의 라인을 줄일 수 있도록 매개 변수를 수행하는 다른 방법을 다루었 다.

  5. ==============================

    5.짧은 구문의 경우, SqlParameterCollection 클래스의 AddRange 메서드를 사용할 수 있습니다. 그 뜻은:

    짧은 구문의 경우, SqlParameterCollection 클래스의 AddRange 메서드를 사용할 수 있습니다. 그 뜻은:

    command.Parameters.AddRange(new [] {
        new SqlParameter(...),
        new SqlParameter(...),
        new SqlParameter(...) });
    

    당신이지고있어 오류 문자열 값이 테이블 열 또는 매개 변수에 맞지 않음을 나타냅니다, 그리고 잘립니다되고있다. 사용자는 데이터가 삽입되는 것에 비해 컬럼의 길이를 확인하거나 SqlParameter에 생성자의 다른 오버를 이용하여 매개 변수의 길이를 지정한다.

  6. ==============================

    6.오류에 관해서, 그것은 즉, 귀하의 매개 변수의 길이 절단에 문제가 열을 저장할 수있는 것보다 더 이상이다. 예를 들어, 귀하의 매개 변수를 전달할 때이 문제를 해결하려면 더 구체적인 일 새로운 SqlParameter에 ( "@ MyParameter", SqlDbType.VarChar, 30).

    오류에 관해서, 그것은 즉, 귀하의 매개 변수의 길이 절단에 문제가 열을 저장할 수있는 것보다 더 이상이다. 예를 들어, 귀하의 매개 변수를 전달할 때이 문제를 해결하려면 더 구체적인 일 새로운 SqlParameter에 ( "@ MyParameter", SqlDbType.VarChar, 30).

    개인적으로 나는 당신의 현재는 읽을 수 그리고 작업을 수행하는 매개 변수를 추가하는 방법과 자신의 IS의 아무것도 잘못을 생각하지 않습니다. 그러나, 당신은 당신이 중 하나를 @Royi 제안 무슨으로 이동하거나 다른 방법으로 추가 매개 변수를 패키징 할 수 함수의 코드 라인의 amont을 줄이려면.

  7. ==============================

    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. ==============================

    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. ==============================

    9.이것은 나를 위해 일한 :

    이것은 나를 위해 일한 :

         comando.Parameters.Add(
                "@EmailAddress", SqlDbType.VarChar).Value = EmailAddress;
    
  10. from https://stackoverflow.com/questions/8148815/c-sharp-sqlparameters-short-hand by cc-by-sa and MIT license