C#의 SqlCommand에 배열 매개변수 전달
C#에서 배열 매개변수를 SQL 명령에 전달하려고 할 때 예상대로 작동하지 않는 문제가 발생할 수 있습니다. 근본 원인은 배열을 SqlCommand에 매개 변수로 직접 추가할 수 없기 때문입니다. 이 문제를 해결하려면 배열의 각 값을 개별적으로 추가해야 합니다.
해결책:
배열 매개변수 정의:
필수 이름과 데이터 유형을 사용하여 매개변수 배열을 만듭니다.
SqlCommand에 매개변수 추가:
배열의 각 값에 대해 새 SqlParameter 개체를 추가하고 해당 이름과 값을 지정합니다. 필요한 경우 적절한 SqlDbType 및 크기를 설정합니다.
IN 절 바꾸기:
CommandText의 "{parameterNameRoot}" 자리 표시자를 쉼표로 구분된 매개변수 이름 목록으로 바꿉니다.
예:
<code class="language-csharp">var parameters = new string[items.Length]; // 此处items应替换为实际的数组变量 var cmd = new SqlCommand(); for (int i = 0; i < items.Length; i++) { cmd.Parameters.AddWithValue("@param" + i, items[i]); } cmd.CommandText = cmd.CommandText.Replace("{param}", string.Join(",", Enumerable.Range(0, items.Length).Select(i => "@param" + i)));</code>
개선된 솔루션:
향상되고 재사용 가능한 솔루션을 확장 방법으로 구현할 수 있습니다.
<code class="language-csharp">public static class SqlCommandExt { public static SqlParameter[] AddArrayParameters<T>(this SqlCommand cmd, string paramNameRoot, IEnumerable<T> values, SqlDbType? dbType = null, int? size = null) { var parameters = new List<SqlParameter>(); var parameterNames = new List<string>(); var paramNbr = 1; foreach (var value in values) { var paramName = string.Format("@{0}{1}", paramNameRoot, paramNbr++); parameterNames.Add(paramName); var p = new SqlParameter(paramName, value); if (dbType.HasValue) p.SqlDbType = dbType.Value; if (size.HasValue) p.Size = size.Value; cmd.Parameters.Add(p); parameters.Add(p); } cmd.CommandText = cmd.CommandText.Replace("{" + paramNameRoot + "}", string.Join(",", parameterNames)); return parameters.ToArray(); } }</code>
사용법:
<code class="language-csharp">var cmd = new SqlCommand("SELECT * FROM TableA WHERE Age IN ({Age})"); cmd.AddArrayParameters("Age", new int[] { 1, 2, 3 });</code>
이 개선된 예에서는 제네릭을 사용하여 더욱 유연하게 만들고 SqlDbType 및 Size를 지정할 수 있습니다. 또한 CommandText에서 매개변수 이름을 직접 연결하여 발생할 수 있는 잠재적인 보안 위험을 방지합니다. 실제 사용 시 TableA
및 Age
를 실제 테이블 및 열 이름으로 바꾸세요.
위 내용은 C#의 배열 매개 변수를 SQLCommand에 전달하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!