C# 在c中为read()使用while循环#

C# 在c中为read()使用while循环#,c#,oracle,C#,Oracle,我是网络开发的初学者。 我已经写了一个代码在文本框中输入序列号 OdbcConnection myOdbcConnection = new OdbcConnection(con1); OdbcCommand myOdbcCommand = myOdbcConnection.CreateCommand(); String sSQL = "SELECT max(slno)+1 FROM driversmaster"; myOdbcCommand.CommandText = sSQL; myOd

我是网络开发的初学者。 我已经写了一个代码在文本框中输入序列号

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() ;
}
经过努力,我得到了我需要的东西。但是我不明白我写的代码是什么,它正在给我答案。为什么我应该使用while循环来读取,何时我可以使用“if语句”

请帮助我了解,以便我能很好地理解代码。
提前谢谢

当使用read时,您将处理从查询中获得的所有结果。如果您使用If语句,您将获得第一个结果(如果有)并完成


简而言之:只要您只希望得到一个结果或没有结果,就可以使用if.

当使用read时,您将处理从查询中获得的所有结果。如果您使用If语句,您将获得第一个结果(如果有)并完成


简而言之:只要您只希望得到一个或没有结果,就可以使用if。

在您的情况下,
if
语句就可以了,因为您只需要查询一行数据。查询数据库数据时,查询通常会返回多行,在这种情况下,您可以使用
Read()
一次一行地遍历每一行

在您的情况下,因为您只检索单个值,所以您可能还需要考虑使用<代码> ExeCudiCaseAuthor()/代码>:


在您的例子中,
if
语句将起作用,因为您只查询一行数据。查询数据库数据时,查询通常会返回多行,在这种情况下,您可以使用
Read()
一次一行地遍历每一行

在您的情况下,因为您只检索单个值,所以您可能还需要考虑使用<代码> ExeCudiCaseAuthor()/代码>:


myOdbcCommand.ExecuteReader()的结果将在数据库中。考虑结果在查询结果后有10行。code>myodbcatareader.Read()
一次只能读取一条记录。所以您需要将这个
Read()
语句放入循环中,以读取所有记录。读取一条记录后,指针将自动指向数据库中的下一条记录。如果您使用的是
If
,它将检查查询是否返回任何结果。执行查询后,至少有一条记录存在或不存在。
在您的情况下,我建议使用
int value=(int)myOdbcCommand.ExecuteScalar()
因为只检索到一个整数值。

myOdbcCommand.ExecuteReader()的结果将在数据库中。考虑结果在查询结果后有10行。code>myodbcatareader.Read()
一次只能读取一条记录。所以您需要将这个
Read()
语句放入循环中,以读取所有记录。读取一条记录后,指针将自动指向数据库中的下一条记录。如果您使用的是
If
,它将检查查询是否返回任何结果。执行查询后,至少有一条记录存在或不存在。
在您的情况下,我建议使用
int value=(int)myOdbcCommand.ExecuteScalar()
因为只检索到一个整数值。

如果
,您是否尝试过
?与
while
if
的结果有什么区别?如果您对单值查询感兴趣,请查找ExecuteScalar而不是ExecuteReader。另外,查看“using”语句,了解如何正确清理数据库资源。在不涉及您的问题的情况下,使用
max()+1
获取序列的“下一个值”实际上是一种糟糕的做法。想想如果两个用户同时运行此查询会发生什么情况-他们将获得相同的序列号…当两个不同的web用户请求一个新序列号时会发生什么情况?他们有相同的号码!此解决方案存在严重的并发问题。在这种情况下,您最好使用Oracle序列。因此,您能告诉我下一个序列号的更好方法吗?您是否尝试过
if
?与
while
if
的结果有什么区别?如果您对单值查询感兴趣,请查找ExecuteScalar而不是ExecuteReader。另外,查看“using”语句,了解如何正确清理数据库资源。在不涉及您的问题的情况下,使用
max()+1
获取序列的“下一个值”实际上是一种糟糕的做法。想想如果两个用户同时运行此查询会发生什么情况-他们将获得相同的序列号…当两个不同的web用户请求一个新序列号时会发生什么情况?他们有相同的号码!此解决方案存在严重的并发问题。在这种情况下,您最好使用Oracle序列。那么您能告诉我下一个序列号的更好方法吗?谢谢您的帮助。所以myOdbcCommand.ExecuteReader();根据我的代码,将有下一个序列号?在您的情况下,读取一次后,指针将指向Null,因为此后没有记录。为此,只需使用ExecuteScalar()。此功能最适合此用途。谢谢您的帮助。所以myOdbcCommand.ExecuteReader();根据我的代码,将有下一个序列号?在您的情况下,读取一次后,指针将指向Null,因为此后没有记录。为此,只需使用ExecuteScalar()。此功能最适合于此目的。
object result = myOdbcCommand.ExecuteScalar();

SlnoTxt.Text = result.ToString();