* 질문 등록 시 다음의 내용을 꼭 기입하여 주세요.
|
Window11 pro |
|
CUBRID 9.3 (9.3.9.0002) (64bit release build for Windows_NT) |
|
10.2.0.0001 (64bit) |
|
odbc |
* CUBRID 응용 오류, SQL 오류 또는 SQL 튜닝 관련된 문의는 반드시 다음의 내용을 추가해 주세요. 비밀글이나 비밀 댓글도 가능합니다.
* 저희가 상황을 이해하고, 재현이 가능해야 알 수 있는 문제들이 많습니다. 가능한 정보/정황들을 부탁합니다.
에러 내용 및 재현 방법 | 재현 가능한 Source와 SQL |
관련 테이블(인덱스, 키정보 포함) 정보 | CUBRID 홈 디렉토리 아래 log 디렉토리 압축 |
-------------- 아래에 질문 사항을 기입해 주세요. ------------------------------------------------------------------------
namespace server
{
public partial class login : Form
{
public struct cubridConn // cubrid 연결
{
public XmlDocument xmlConfig; // xml 설정 가져오기
public string dbConnectString;
public bool dbOpenState;
public OdbcConnection dbConn;//큐브리드 연결.
}
public cubridConn _serverComm = new cubridConn();
public login()
{
InitializeComponent();
Thread_CubridConnect();
}
public Server socNaverBlog;
private void login_Load(object sender, EventArgs e)
{
try
{
//xml 주소
_serverComm.xmlConfig = new XmlDocument();
_serverComm.xmlConfig.Load(Application.StartupPath + "/login.xml"); // xml파일을 로드(시작점은 login.xml 파일로 부터)
// database
XmlNode dbConnectString = _serverComm.xmlConfig.SelectSingleNode("/DB_Connect");
_serverComm.dbConnectString = dbConnectString.InnerText;
//MessageBox.Show(_serverComm.dbConnectString);
}
catch (Exception)
{
MessageBox.Show("실행 파일 에러. 관리자에게 문의하세요.");
}
}
private void Thread_CubridConnect()
{
System.Threading.Timer timerDB = new System.Threading.Timer(DB_Connect);
timerDB.Change(0, 2000); //OK
}
object _lockobject;
private void DB_Connect(object sender)
{
try
{
if (!_serverComm.dbOpenState)
{
_serverComm.dbConn = new OdbcConnection(_serverComm.dbConnectString);
//MessageBox.Show(_serverComm.dbConnectString);
_serverComm.dbConn.Open();
_serverComm.dbOpenState = true;
if (_serverComm.dbConn.State == ConnectionState.Closed)
return;
}
}
catch (OdbcException)
{
}
catch (Exception ex)
{
}
finally
{
_serverComm.dbConn.Close();
}
}
signup signup = new signup();
private void btn_new_Click(object sender, EventArgs e)
{
signup.ShowDialog();
}
Server serverSoc = new Server();
private void btn_login_Click(object sender, EventArgs e)
{
string id = textBox1.Text; //①,②
string pw = textBox2.Text; //①,②
string userID = textBox1.Text;//③
string userPW = textBox2.Text;//③
//OdbcCommand cmd = new OdbcCommand();
//cmd.CommandType = CommandType.Text;
//cmd.CommandText = "SELECT id,pw FROM sock_table WHERE id = '" + id + "'&& pw = '" + pw + "';";
//string query = "SELECT * FROM sock_table WHERE id=? and pw=?"; //①
string sql_cub_sel = "SELECT * FROM sock_table WHERE id=? and pw=?"; ③
string sql_cub_sel = "SELECT * FROM sock_table WHERE id=@id and pw=@pw"; ④
//string sql_cub_ins = "INSERT INTO sock (id,pw) VALUES (@id,@pw);";
//OdbcConnection conn = new OdbcConnection(_serverComm.dbConnectString);//①,②
using (var connect = new OdbcConnection(_serverComm.dbConnectString))
{
try
{
connect.Open(); //연결
using (var command = new OdbcCommand(sql_cub_sel, connect))
{
command.Parameters.AddWithValue("@id", userID);
command.Parameters.AddWithValue("@pw", userPW);
command.ExecuteNonQuery();
connect.Close();
}
MessageBox.Show(userID + "로그인 완료");
serverSoc.ShowDialog();
}
catch (Exception)
{
throw;
}
}
}
}
}
로그인 버튼 클릭시 DB 에 있는 데이터를 select 해와서 로그인 하려고 하는데요,
파라미터 바인딩을 사용 하려고 합니다.
보통 c#은 파라미터 바인딩 할 때 @변수 를 붙이는 데 큐브리드의 경우 쿼리에 @변수를 붙여서 실행하면 (④번 쿼리문의 경우)
예외처리가 되지 않음
System.Data.Odbc.OdbcException: 'ERROR [HY000] [CUBRID][ODBC CUBRID Driver][-1070]Session variable '@id' not defined.[CAS INFO-10.10.10.60:33000,1,12988].'
이런 알림 문구가 뜹니다.
③번 쿼리문 처럼 '?'를 넣으면 문제 없이 실행되는데
혹시 큐브리드만의 파라미터 바인딩 방식이 있는지 궁금합니다
? 를 사용해야 하며, 순서를 지켜야 하는 제약만 있습니다.
상세내용은 https://www.cubrid.org/manual/ko/11.2/api/adodotnet.html#id10 참고 바랍니다.
감사합니다.