Visual Studio 2015, Windows 10, 64 비트에서 MySql 5.6x를 사용하고 있습니다. 프로그래밍 언어로서의 C #. 내 CRUD.cs (클래스 파일)에서 다음 방법을 만들었습니다.
public bool dbQuery(string sql,string[] paramList= null)
{
bool flag = false;
try
{
connect();
cmd = new MySqlCommand(sql,con);
cmd.Prepare();
if(paramList != null){
foreach(string i in paramList){
string[] valus = i.Split(',');
string p = valus[0];
string v = valus[1];
cmd.Parameters[p].Value = v;
}
}
if (cmd.ExecuteNonQuery() > 0)
{
flag = true;
}
}
catch (Exception exc)
{
error(exc);
}
}
다음과 같이 쿼리 및 매개 변수 목록을 전달합니다.
protected void loginBtn_Click(object sender, EventArgs e)
{
string sql = "SELECT * FROM dept_login WHERE (user_email = ?user_email OR user_cell = ?user_cell) AND userkey = ?userkey";
string[] param = new string[] {
"?user_email,"+ userid.Text.ToString(),
"?user_cell,"+ userid.Text.ToString(),
"?userkey,"+ userkey.Text.ToString()
};
if (db.dbQuery(sql, param))
{
msg.Text = "Ok";
}
else
{
msg.Text = "<strong class='text-danger'>Authentication Failed</strong>";
}
}
이제 문제는 루프 반복이 완료된 후 catch () 블록으로 직접 점프하여 다음과 같은 예외를 생성한다는 것입니다.
Parameter '?user_email' not found in the collection.
그런 매개 변수를 보내기 위해 올바르게 수행하고 있습니까? 동일한 작업을 수행하는 다른 방법이 있습니까? 감사
편집 : 가장 좋은 방법은 매개 변수와 해당 값을 수집하고 cmd.AddWidthValues ()에서 매개 변수를 가져 오는 메서드 내에서 반복하는 2 차원 배열 일 수 있다고 생각합니까? 내가 틀렸을지도 몰라 ...
당신에 dbQuery 존재하지 않는 매개 변수의 값을 설정하려고하면 오류를 얻을 수 있도록, 예상 이름으로 매개 변수 컬렉션을 생성하지 않는
public bool dbQuery(string sql,string[] paramList= null)
{
bool flag = false;
try
{
connect();
cmd = new MySqlCommand(sql,con);
cmd.Prepare();
if(paramList != null){
foreach(string i in paramList){
string[] valus = i.Split(',');
string p = valus[0];
string v = valus[1];
cmd.Parameters.AddWithValue(p, v);
}
}
if (cmd.ExecuteNonQuery() > 0)
flag = true;
}
catch (Exception exc)
{
error(exc);
}
}
물론 이것은 데이터 유형이 문자열과 같은 모든 매개 변수를 추가하므로 데이터 테이블 열이 문자열 유형이 아닌 경우 오류가 발생하기 쉽습니다.
더 나은 접근 방식은 이것입니다
List<MySqlParameter> parameters = new List<MySqlParameter>()
{
{new MySqlParameter()
{
ParameterName = "?user_mail",
MySqlDbType= MySqlDbType.VarChar,
Value = userid.Text
},
{new MySqlParameter()
{
ParameterName = "?user_cell",
MySqlDbType= MySqlDbType.VarChar,
Value = userid.Text
},
{new MySqlParameter()
{
ParameterName = "?userkey",
MySqlDbType = MySqlDbType.VarChar,
Value = userkey.Text
},
}
if (db.dbQuery(sql, parameters))
....
그리고 dbQuery 에서 목록을 받아 매개 변수 컬렉션에 추가합니다.
public bool dbQuery(string sql, List<MySqlParameter> paramList= null)
{
bool flag = false;
try
{
connect();
cmd = new MySqlCommand(sql,con);
cmd.Prepare();
if(paramList != null)
cmd.Parameters.AddRange(paramList.ToArray());
if (cmd.ExecuteNonQuery() > 0)
{
flag = true;
}
}
catch (Exception exc)
{
error(exc);
}
}
그건 그렇고, 실제 문제와 관련이 없지만 코드가 연결을 닫고 처분하지 않는 것 같습니다. 이것은 진단하고 고치는 매우 심한 문제로 이어질 것입니다. using 문을 사용하고 전역 연결 변수를 피하십시오.
편집 ExecuteNonQuery가 SELECT 문과 함께 작동하지 않는다는 것을 알았으므로 ExecuteReader를 사용하고 반환 값이 있는지 확인해야합니다.
using(MySqlDataReader reader = cmd.ExecuteReader())
{
flag = reader.HasRows;
}
이것은 물론 ExecuteNonQuery가 필요한 곳에 레코드를 삽입, 업데이트 또는 삭제할 때 문제가 발생 함을 의미합니다. 다른 종류의 쿼리를 처리하는 범용 함수를 만드는 것은 매우 어렵고 필요한 작업과 디버그의 가치가 없습니다. EntityFramework 또는 Dapper와 같은 잘 알려진 ORM 소프트웨어를 사용하는 것이 좋습니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다