내 C # 응용 프로그램에서 MySQL 쿼리를 구성하려고하는데 MySQL 매개 변수에서 OR 문을 사용할 수 있는지 궁금합니다.
이름 목록이 있고 데이터베이스에 이미 존재하는 이름이 무엇인지 확인하고보고 싶습니다. 다음은 간단한 예입니다.
List<string> names = new List<string> {"adam", "bob", "cathy"}; //actual list is much longer
MySqlConnection connection = getAndOpenConnection();
MySqlCommand command = connection.CreateCommand();
command.CommandText = "SELECT * FROM Employees WHERE name = @names";
command.Parameters.Add(new MySqlParameters("@names", String.Format("names = {0}", String.Join(names, " or name = ")))); //is this line legal?
내 원래 아이디어는 다음과 같이 명령 텍스트를 구성하는 것입니다.
command.CommandText = String.Format("SELECT * FROM Employees WHERE name = '{0}'", String.Join(names, "' or name = '"))
코드는 내가 원하는 올바른 명령 텍스트를 제공하지만 SQL 삽입을 정말로 방지하고 싶습니다.
누군가 MySqlCommand를 올바르게 구성하는 방법에 대해 저를 도울 수 있습니까?
쉽지는 않습니다. 당신은 그것을 IN
쿼리 로 만들어야 하는데, 이것은 매개 변수화와 관련하여 고통 스럽습니다. 기본적으로 두 가지 옵션이 있습니다.
후자는 더 쉽습니다. "dapper"를 사용하면 다음과 같습니다.
connection.Query("SELECT * FROM Employees WHERE name in @names", new { names })
.ToList();
(이는 것 List<dynamic>
, 당신이있는 경우 Employee
열을 일치 클래스를 사용할 수 connection.Query<Employee>(...).ToList()
얻을 List<Employee>
대신을).
그러나 전자는 (간단한 버전의 경우) 더 비슷합니다.
var sb = new StringBuilder("SELECT * FROM Employees WHERE name=@name0");
cmd.Parameters.AddWithValue("name0", names[0]);
for(int i = 1; i < names.Count ; i++) {
sb.Append(" or name=@name").Append(i);
cmd.Parameters.AddWithValue("name" + i, names[i]);
}
cmd.CommandText = sb.ToString();
다른 몇 가지 방법도 있습니다.
switch(names.Count)
{
case 0: cmd.CommandText = "SELECT * FROM Employees"; break;
case 1:
cmd.CommandText = "SELECT * FROM Employees WHERE name=@name";
cmd.Parameters.AddWithValue("name", names[0]);
break;
default:
var sb = new StringBuilder(
"SELECT * FROM Employees WHERE name IN (@name0")
cmd.Parameters.AddWithValue("name0", names[0]);
for(int i = 1;i<names.Count;i++) {
sb.Append(",@name").Append(i);
cmd.Parameters.AddWithValue("name" + i, names[i]);
}
cmd.CommandText = sb.Append(")").ToString();
break;
}
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다