[SQL] 어떻게 SQL에서 문을위한 SqlParameter에로 목록 <문자열>을 번역 하는가? [복제]
SQL어떻게 SQL에서 문을위한 SqlParameter에로 목록 <문자열>을 번역 하는가? [복제]
나는 SqlParameter에 함께에서 문을 수행하는 방법에 혼동 될 것으로 보인다. 지금까지 나는 다음과 같은 코드가 있습니다 :
cmd.CommandText = "Select dscr from system_settings where setting in @settings";
cmd.Connection = conn;
cmd.Parameters.Add(new SqlParameter("@settings", settingList));
reader = cmd.ExecuteReader();
settingsList은 목록 <문자열>입니다. cmd.ExecuteReader ()가 호출 될 때, 나는 인해 "알려진 공급자 유형"에 목록 <문자열> 매핑 할 수없는에 ArgumentException이 얻을.
어떻게 (안전) SqlCommands과에서 쿼리를 수행합니까?
해결법
-
==============================
1.당신이 뭔가를 시도 할 수 있습니다 :
당신이 뭔가를 시도 할 수 있습니다 :
string sql = "SELECT dscr FROM system_settings WHERE setting IN ({0})"; string[] paramArray = settingList.Select((x, i) => "@settings" + i).ToArray(); cmd.CommandText = string.Format(sql, string.Join(",", paramArray)); for (int i = 0; i < settingList.Count; ++i) { cmd.Parameters.Add(new SqlParameter("@settings" + i, settingList[i])); }
-
==============================
2.당신은 멀티 반환 매개 변수를 전달하려고하는, 그 SQL 구문은 당신이 무엇을 기대하지 않을 것입니다 나타납니다. 당신은 테이블 값 매개 변수를 전달 할 수 있습니다.
당신은 멀티 반환 매개 변수를 전달하려고하는, 그 SQL 구문은 당신이 무엇을 기대하지 않을 것입니다 나타납니다. 당신은 테이블 값 매개 변수를 전달 할 수 있습니다.
이 읽기 : http://www.sommarskog.se/arrays-in-sql.html#iter-list-of-strings
특히 : http://www.sommarskog.se/arrays-in-sql-2008.html#ListSqlDataRecord
private static void datatable_example() { string [] custids = {"ALFKI", "BONAP", "CACTU", "FRANK"}; DataTable custid_list = new DataTable(); custid_list.Columns.Add("custid", typeof(String)); foreach (string custid in custids) { DataRow dr = custid_list.NewRow(); dr["custid"] = custid; custid_list.Rows.Add(dr); } using(SqlConnection cn = setup_connection()) { using(SqlCommand cmd = cn.CreateCommand()) { cmd.CommandText = @"SELECT C.CustomerID, C.CompanyName FROM Northwind.dbo.Customers C WHERE C.CustomerID IN (SELECT id.custid FROM @custids id)"; cmd.CommandType = CommandType.Text; cmd.Parameters.Add("@custids", SqlDbType.Structured); cmd.Parameters["@custids"].Direction = ParameterDirection.Input; cmd.Parameters["@custids"].TypeName = "custid_list_tbltype"; cmd.Parameters["@custids"].Value = custid_list; using (SqlDataAdapter da = new SqlDataAdapter(cmd)) using (DataSet ds = new DataSet()) { da.Fill(ds); PrintDataSet(ds); } } } }
-
==============================
3.나는 지금과 같은 매개 변수를 만들려면 내 자신의 함수를 사용
나는 지금과 같은 매개 변수를 만들려면 내 자신의 함수를 사용
public void SomeDataFunction() { ArrayList params = GetParameters(someEntity); CommandObject.Parameters.AddRange(parameters.ToArray()); } public static ArrayList GetParameters(ISomeEntity entity) { ArrayList result = new ArrayList { OleDbUtility.NewDbParam("@Param1", OleDbType.Integer, , entity.Parameter1), OleDbUtility.NewDbParam("@Param2", OleDbType.VarChar, 9, entity.Parameter2), } } public static OleDbParameter NewDbParam(string parameterName, OleDbType dataType, int size, object value) { OleDbParameter result = new OleDbParameter(parameterName, dataType, size, string.Empty); result.Value = value; return result; }
-
==============================
4.당신은 SQL Server 2008 이상을 사용하는 경우, 당신은 테이블 반환 매개 변수를 사용할 수있다 - 이것은 당신이 매개 변수로 값의 테이블에 전달할 수 있습니다. .NET에서 당신은 "구조화"형 SqlParameter에 정의 및 구현을 IEnumerable 뭔가에 값을 설정합니다.
당신은 SQL Server 2008 이상을 사용하는 경우, 당신은 테이블 반환 매개 변수를 사용할 수있다 - 이것은 당신이 매개 변수로 값의 테이블에 전달할 수 있습니다. .NET에서 당신은 "구조화"형 SqlParameter에 정의 및 구현을 IEnumerable 뭔가에 값을 설정합니다.
여기에 예제와 함께 전체 MSDN 참조를 참조하십시오 : http://msdn.microsoft.com/en-us/library/bb675163.aspx
-
==============================
5.사용 XML,이 시나리오 빨리의 많은. 당신은 XML로 목록을 설정하고 단순히 문자열을 전달합니다 :
사용 XML,이 시나리오 빨리의 많은. 당신은 XML로 목록을 설정하고 단순히 문자열을 전달합니다 :
CREATE TABLE #myTempTable ( Letter VARCHAR(20) ) INSERT INTO #myTempTable (Letter) VALUES ('A'), ('B') Declare @xml XML = '<a>A</a><a>B</a><a>C</a>' Select * from #myTempTable Where Letter in (Select p.value('.', 'VARCHAR(40)') AS [Letter] from @xml.nodes('//a') as t(p)) DROP TABLE #myTempTable
-
==============================
6.나는 쉼표 문자열을 분리로 일반적으로 목록을 전달하고 난 다음 다른 쿼리와 결합하는 데 사용할 수있는 테이블에 '분할'문자열 테이블 반환 함수를 사용합니다.
나는 쉼표 문자열을 분리로 일반적으로 목록을 전달하고 난 다음 다른 쿼리와 결합하는 데 사용할 수있는 테이블에 '분할'문자열 테이블 반환 함수를 사용합니다.
DECLARE @Settings TABLE (Sid INT) INSERT INTO @Settings(Sid) SELECT CAST(Items AS INT) FROM dbo.Split(@SettingsParameter, ',')
물론 당신은 SQL Server 2008을 사용하지 않는 경우, 그때 테이블을 반환 매개 변수를 사용합니다.
from https://stackoverflow.com/questions/4502821/how-do-i-translate-a-liststring-into-a-sqlparameter-for-a-sql-in-statement by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] MySQL의 서브 쿼리 반환 둘 이상의 행 (0) | 2020.05.25 |
---|---|
[SQL] SQL Server의 UNIX_TIMESTAMP (0) | 2020.05.25 |
[SQL] PLS-00428 : INTO 절은이 SELECT 문에 기대된다 (0) | 2020.05.25 |
[SQL] 크로스 조합 (하지 순열)는 SQL에 참여 (0) | 2020.05.25 |
[SQL] MySQL은 INSERT와 UPDATE 사이의 차이점은 무엇입니까? (0) | 2020.05.25 |