2013-02-11 6 views
1

저는 웹 개발 초보자입니다. 텍스트 상자에 시리얼 번호를 입력하는 코드가 있습니다.while 루프를 사용하여 read() for C#

OdbcConnection myOdbcConnection = new OdbcConnection(con1); 

OdbcCommand myOdbcCommand = myOdbcConnection.CreateCommand(); 
String sSQL = "SELECT max(slno)+1 FROM driversmaster"; 

myOdbcCommand.CommandText = sSQL; 

myOdbcConnection.Open(); 

OdbcDataReader myOdbcDataReader = myOdbcCommand.ExecuteReader(); 

while (myOdbcDataReader.Read() != false) 
{ 
    SlnoTxt.Text = myOdbcDataReader[0].ToString().Trim() ; 
} 

많은 어려움을 겪은 후에 내가 필요한 것을 얻었습니다. 하지만 필자가 작성한 코드가 무엇인지 이해하지 못한다. 왜 내가 "if 문"을 사용할 수 있습니까?

제가 코드를 잘 이해할 수 있도록 알려주십시오. 미리 감사드립니다.

+2

'if'를 사용해 보셨습니까? ''while''과''if''의 결과의 차이점은 무엇입니까? – yogi

+0

단일 값 쿼리에 관심이있을 때 ExecuteReader 대신 ExecuteScalar를 찾습니다. 또한 "using"문을보고 데이터베이스 리소스를 올바르게 정리하는 방법을 알아보십시오. –

+1

"max() + 1"을 사용하여 시리얼의 "다음 값"을 얻는 것은 정말 나쁜 습관입니다. 2 명의 사용자가 동시에이 쿼리를 실행하면 어떤 일이 일어날 지 생각해보십시오. 동일한 시리얼을 얻을 것입니다 ... –

답변

0

당신이 당신의 질문에서 얻은 모든 결과를 읽으 실 때. if 문을 사용하면 첫 번째 결과 (있는 경우)가 완료되고 완료됩니다.

이렇게 짧게 만들려면 다음과 같이 하나 또는 그 이상의 결과 만 기대한다면, if를 사용할 수 있습니다.

0

한 행의 데이터 만 쿼리하기 때문에 if 문이 작동합니다. 종종 데이터베이스 데이터를 쿼리 할 때 쿼리는 여러 행을 반환 할 수 있으며이 경우 Read()을 사용하면 한 번에 하나씩 각 행을 넘겨 줄 수 있습니다.

object result = myOdbcCommand.ExecuteScalar(); 

SlnoTxt.Text = result.ToString(); 
+0

도움을 주셔서 감사합니다 –

1

myOdbcCommand.ExecuteReader();의 결과는 데이터베이스에있을 것입니다 : 당신은 단지 하나의 값을 검색하고 있기 때문에 귀하의 경우에는

는, 당신은 또한 ExecuteScalar() 사용을 고려할 수 있습니다. 결과에 쿼리 결과 후 10 행이 있다고 가정합니다. myOdbcDataReader.Read()은 한 번에 하나의 레코드 만 읽습니다. 따라서 모든 레코드를 읽으려면이 Read() 문을 루프 안에 넣어야합니다. 하나의 레코드를 읽은 후 포인터는 자동으로 데이터베이스의 다음 레코드를 가리 킵니다. if을 사용하는 경우 쿼리가 결과를 반환했는지 여부를 확인합니다. 즉, 쿼리를 실행 한 후 하나 이상의 레코드가 존재하는지 여부입니다.
정수 값이 하나만 검색되므로
int value=(int)myOdbcCommand.ExecuteScalar();
을 사용하는 것이 좋습니다.

+0

도움 주셔서 감사합니다. 그래서 myOdbcCommand.ExecuteReader(); 내 코드에 따르면 다음 번 시리얼을 가질 수 없을까? –

+0

한 번 읽은 후 포인터가 Null을 가리키게됩니다. 그 이후에는 레코드가 없기 때문입니다. 이 목적으로 ExecuteScalar()를 사용하기 만하면됩니다. 이 기능은이 목적에 가장 적합합니다. – sujeesh

+0

정말 고마워요. –

관련 문제