C#查询oracle时,为何只能显示第一列的值?怎么样全部显示啊?还有将查询结果显示到text中怎么弄?

菁菁依草 2011-04-21 11:15:06
我想要的结果是在一个文本框中输入sql语句,点击查询后,在另外一个文本框中显示结果。
现在的问题是
1)public void queryDB(String suid, String spwd, String sdbname,String ssql)
{
string ConnectionString = "Data Source=" + sdbname + ";user=" + suid + ";password=" + spwd + ";";//写连接串
OracleConnection conn = new OracleConnection(ConnectionString);//创建一个新连接
try
{
conn.Open();
OracleCommand cmd = conn.CreateCommand();

cmd.CommandText = ssql;
OracleDataReader odr = cmd.ExecuteReader();
while (odr.Read())
{
int i;
for (i = 1; i < 20; i++)
{
String s = odr.GetOracleString(i).ToString();

Console.WriteLine(s);
}
}
odr.Close();
}
catch (Exception ee)
{
HttpContext.Current.Response.Write(ee.Message); //如果有错误,输出错误信息
}
finally
{
conn.Close(); //关闭连接
}
}
因为之前我没有用for循环,只能显示第一列的值,但是用了for循环之后,如果值为null的话,就会出现错误!

2)怎么将查询出来的结果,输出到指定的text中呢。我现在是在调试环境下,输出到output中看的结果。

本人纯属菜鸟啊,有大神来搭救一把~多谢啦~
...全文
387 23 打赏 收藏 转发到动态 举报
写回复
用AI写文章
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
菁菁依草 2011-04-28
  • 打赏
  • 举报
回复
这个帖子,结了。
非常感谢athwind!每次回答都很到位,得到了很大的帮助。因为我是初学,虽然有点着急,但并不是就解决了拉到,肯定也会慢慢积累的!
另外lvfeng同学,说话很让人不舒服。没耐心也就算了,解决问题还总说不到点子上,要么就给出那么个句子也不解释为什么。没错,我是很菜,不菜就不在这请教别人了。还什么希望最后一次回,我求着你回了么!可能你是很牛,但你这个态度,确实给你打了不少的折扣!最后还是给你五分,不白浪费你的时间跟精力!!
lvfeng19806001 2011-04-28
  • 打赏
  • 举报
回复
[Quote=引用 22 楼 lvna0802 的回复:]

这个帖子,结了。
非常感谢athwind!每次回答都很到位,得到了很大的帮助。因为我是初学,虽然有点着急,但并不是就解决了拉到,肯定也会慢慢积累的!
另外lvfeng同学,说话很让人不舒服。没耐心也就算了,解决问题还总说不到点子上,要么就给出那么个句子也不解释为什么。没错,我是很菜,不菜就不在这请教别人了。还什么希望最后一次回,我求着你回了么!可能你是很牛,但你这个态度,确实给你打了不少的折……
[/Quote]
呵呵,先向你道歉吧!
我的表达确实有问题,本来的想法是:最好把问题分开问,这样楼层少,能解决的几率大,这是个同行告诉我的,昨天快下班时急了,就说了一句。。最后一次回。。,其实只有自己心里明白想说什么,不过今天看看,这话谁能理解成我上面说的,呵呵,抱歉了!
自己也是初学,也在网上希望得到别人的指导,而且网上的前辈也都挺好。
其实我也是刚开始搞这个,也是菜鸟中的菜鸟,所以总感觉自己说的别人都会。语言表达能力总有问题,平时和同事讨论有时都吵起来,自己太急了。
今天的回复只是想告诉你csdn的前辈还是很好的,不想因为我让你失去在csdn学习的热情。希望你进步!
菁菁依草 2011-04-27
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 athwind 的回复:]
引用 15 楼 lvna0802 的回复:
引用 12 楼 athwind 的回复:
原因是odr.GetOracleString(i)的值是null或者DBNull.Value,刚才写漏了,下面有解释

这样改了后,error提示说:Operator '==' cannot be applied to operands of type 'System.Data.OracleClient.……
[/Quote]
恩,大师就是大师呀~这样改了果然好使了,看来我用的是.net自带的oracle组件了。

还有个问题就是,我想显示的是表中所有的列,select * ,但是用for循环控制的时候,不知道如何确定结束时机。以前我是学java的,知道用length函数来控制。现在是定了一个比较大的20,但这样肯定是不行的,请教大神怎么解决啊??
还有把结果输出到text中怎么弄?我现在是在控制台输出的。。。
DSIOF3KIDSKTR 2011-04-27
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 lvna0802 的回复:]
引用 12 楼 athwind 的回复:
原因是odr.GetOracleString(i)的值是null或者DBNull.Value,刚才写漏了,下面有解释

这样改了后,error提示说:Operator '==' cannot be applied to operands of type 'System.Data.OracleClient.OracleString' and 'Syst……
[/Quote]
我没用过Oracle的连接,但是如果是.net自带的System.Data.OracleClient中应该没odr.GetOracleString(i)这个方法,你是不是用的oracle的.net组件?我不知道是做什么用的,返回的是什么类型?
如果是.net自带的oracle组件,你可以odr[i]来获取值,
String s = ((odr[i]==DBNull.Value) || (odr[i]==null))?"-":odr[i].ToString()
DSIOF3KIDSKTR 2011-04-27
  • 打赏
  • 举报
回复
[Quote=引用 19 楼 lvna0802 的回复:]

引用 18 楼 athwind 的回复:
引用 15 楼 lvna0802 的回复:
引用 12 楼 athwind 的回复:
原因是odr.GetOracleString(i)的值是null或者DBNull.Value,刚才写漏了,下面有解释

这样改了后,error提示说:Operator '==' cannot be applied to operands of type 'Sy……
[/Quote]

汗!千万别叫我大师,我很菜。
如果要获取DataReader的字段(列)数,可以用它的FieldCount属性,
for (i = 0; i < odr.FieldCount; i++)
{
s = odr.GetOracleString(i).ToString() == "Null" ? " - " : odr.GetOracleString(i).ToString();
Console.WriteLine(s);
}

如果要输出到Text中需要用到数据流,比如FileStream,MemoryStream之类的,当然还有对文件的操作类File等,其实也很简单,不过就你目前的状况来说可能有点超出范围了,慢慢来吧
菁菁依草 2011-04-27
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 csharemyside 的回复:]
String s=DBNull(odr.GetOracleString(i))?"":odr.GetOracleString(i).ToString();

上面少了个问号
[/Quote]
'System.DBNull' is a 'type' but is used like a 'variable',这个用法不对啊。。
菁菁依草 2011-04-27
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 athwind 的回复:]
原因是odr.GetOracleString(i)的值是null或者DBNull.Value,刚才写漏了,下面有解释
[/Quote]
这样改了后,error提示说:Operator '==' cannot be applied to operands of type 'System.Data.OracleClient.OracleString' and 'System.DBNull',貌似两者不能用“==”进行判断。。。
(odr.GetOracleString(i)==DBNull.Value) ,这句的问题。
lvfeng19806001 2011-04-27
  • 打赏
  • 举报
回复
[Quote=引用 19 楼 lvna0802 的回复:]

引用 18 楼 athwind 的回复:
引用 15 楼 lvna0802 的回复:
引用 12 楼 athwind 的回复:
原因是odr.GetOracleString(i)的值是null或者DBNull.Value,刚才写漏了,下面有解释

这样改了后,error提示说:Operator '==' cannot be applied to operands of type 'Sy……
[/Quote]
odr.GetOracleString(i)值是null还是DBNull.Value,这个你打断点应该能看到的,不知你都是怎么调试的;
不过像你9楼的odr.GetOracleString(i).ToString() == "Null" 肯定是错的,要判断的是ToString()前面的,理由12楼说的很清楚了;
要一条一条展示记录,odr.Read()就是定位到下一条记录,访问时用odr[列索引]或odr[列名]访问即可;
希望这个帖子我是最后一次回了!!
lvfeng19806001 2011-04-26
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 lvna0802 的回复:]

while (odr.Read())//读取数据,如果odr.Read()返回为false的话,就说明到记录集的尾部了
{
int i;
for (i = 1; i < 20; i++)
{
if (odr.GetOracleString(i).ToString() != null)
{……
[/Quote]
真的很佩服你, if (odr.GetOracleString(i).ToString() != null)这句有误,应该是:
if (odr.GetOracleString(i) != null);
你好好看看别人回帖就不会这样写了!
CShareMySide 2011-04-26
  • 打赏
  • 举报
回复
String s=DBNull(odr.GetOracleString(i))?"":odr.GetOracleString(i).ToString();

上面少了个问号
CShareMySide 2011-04-26
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 lvfeng19806001 的回复:]
空指针异常是由于String s = odr.GetOracleString(i).ToString();这句中的odr.GetOracleString(i)为null;
两种处理办法:1:ssql语句中处理,用nvl函数,具体用法看msdn;
2: 将上面这句改为:
String s = odr.GetOracleString(i)==null?"":odr.GetOracleSt……
[/Quote]

String s=DBNull(odr.GetOracleString(i))"":odr.GetOracleString(i).ToString();
DSIOF3KIDSKTR 2011-04-26
  • 打赏
  • 举报
回复
原因是odr.GetOracleString(i)的值是null或者DBNull.Value,刚才写漏了,下面有解释
DSIOF3KIDSKTR 2011-04-26
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 lvna0802 的回复:]

回复1#:
大神,你怎么看的,命名就是在while循环外面的额~
遇到表格中数据为空的时候,还是会出现异常。
这个怎么解决呢???
[/Quote]
问题出在这:String s = odr.GetOracleString(i).ToString();
初学者包括入行很久的人都经常犯的错误,原因是odr.GetOracleString(i)的值是null
这时你再调用ToString()方法,肯定出现异常。
s = odr.GetOracleString(i).ToString() == "Null" ? " - " : odr.GetOracleString(i).ToString();
这个不对,“Null”是一个字符串了。
这样写就可以了:
String s = ((odr.GetOracleString(i)==DBNull.Value) || (odr.GetOracleString(i)==null))?"-":odr.GetOracleString(i).ToString();

【PS:
1.null表示一个对象的指向无效,即该对象为空对象。
DBNull.Value表示一个对象在数据库中的值为空,或者说未初始化,DBNull.Value对象是指向有效的对象。
2. ExecuteScalar 的规则就是,返回第一列,第一行的数据。如果一行都没有,那么ExecuteScalar就返回null。如果有第一行,但是第一列为空,那么返回的是 DBNull 。如果第一列第一行不为空,那么ExecuteScalar就直接对应的DotNet的值。
3.
对于 DataRow , 它的 row[column] 返回的值永远不为 null , 要么就是具体的为column 的类型的值 。要么就是 DBNull
小志 2011-04-26
  • 打赏
  • 举报
回复
判断数据库中的数据是否为空应该要用DBNull.Value
String s = odr.GetOracleString(i)==DBNull.Value?"":odr.GetOracleString(i).ToString();
菁菁依草 2011-04-26
  • 打赏
  • 举报
回复
额。。。ls说的这种可能我早就试过了,这几天一直在不停的试来试去。。。
改成这样的话,输出的结果更奇怪。有值的就输出“-”,到了值为空的就抛出异常了。
现在改成这样的了:
while (odr.Read())
{
int i;
String s ;
for (i = 1; i < 20; i++)
{
s = odr.GetOracleString(i).ToString() == "Null" ? " - " : odr.GetOracleString(i).ToString();
Console.WriteLine(s);
}
}
我的数据库第五列的值是空,应该输出“-”,但是输出完了,等i=6的时候,一运行到给s赋值那里,就跳到cache了。。提示说“指定的转换无效”
可能本人太菜了,这两天一直卡在这,做不下去了。。⊙﹏⊙b汗。。
菁菁依草 2011-04-25
  • 打赏
  • 举报
回复
while (odr.Read())//读取数据,如果odr.Read()返回为false的话,就说明到记录集的尾部了
{
int i;
for (i = 1; i < 20; i++)
{
if (odr.GetOracleString(i).ToString() != null)
{
String s = odr.GetOracleString(i).ToString();

Console.WriteLine(s);
}
else
Console.WriteLine("-");
// nvl(odr.GetOracleString(i).ToString(),"-");

}
}
while循环改成这样的了,我的table中,第一行的第五列是空置,读完第五列获得的是null,然后就到cache了,抛出异常,不能再继续读后面的数据了!
怎么会这样呢。。。
che19891016 2011-04-21
  • 打赏
  • 举报
回复
你读完第一条就把odr。close()掉了 当然读不到了,在while循环外关闭,另外写如TEXT用写入流就可以解决
lvfeng19806001 2011-04-21
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 lvna0802 的回复:]

引用 3 楼 lvfeng19806001 的回复:
空指针异常是由于String s = odr.GetOracleString(i).ToString();这句中的odr.GetOracleString(i)为null;
两种处理办法:1:ssql语句中处理,用nvl函数,具体用法看msdn;
2: 将上面这句改为:
String s = odr.GetOracleString(i)……
[/Quote]
1:nvl是数据库中sql语句的语法,假如select name from table1改成select nvl(name,'') from table1
2:这种办法应该不报错啊,你用你的Text的名字.Text=s看看
菁菁依草 2011-04-21
  • 打赏
  • 举报
回复
nvl函数,需要在头文件中引用哪个空间??
菁菁依草 2011-04-21
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 lvfeng19806001 的回复:]
空指针异常是由于String s = odr.GetOracleString(i).ToString();这句中的odr.GetOracleString(i)为null;
两种处理办法:1:ssql语句中处理,用nvl函数,具体用法看msdn;
2: 将上面这句改为:
String s = odr.GetOracleString(i)==null?"":odr.GetOracleSt……
[/Quote]

用过第二种办法,还是不行,它不会输出空格,而是会输出null。
A first chance exception of type 'System.InvalidCastException' occurred in System.Data.OracleClient.dll
至于第一种方法,完全不会啊。。。
加载更多回复(2)

110,537

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧