我的SQL datareader
存在问题,我想创建一个外部类,并尽可能缩短xaml.cs
中的代码,因为需要大量的sqldatareaders
在我的程序中。为此,我想将以下两个字符串传递给datareader
类:
public void refreshcombobox()
{
cbGebruiker.Items.Clear();
database = new DataBase();
string sqlrdr = "(rdr.GetString(1).ToString().Trim())";
List<string> reader = database.ReaderRdr("Select * from Gebruikers", ref sqlrdr);
foreach (String str in reader)
{
cbGebruiker.Items.Add(str);
}
}
然而,当我这样做时,这是我的程序中的结果,而不是存储在database
中的实际结果:
http://i58.tinypic.com/301j2vo.jpg(我无法发布图片)
有人可以帮我这个吗?我到处搜索过......
我不知道如何传递rdr.GetString(1).ToString().Trim()
以使其实际上在数据库中查找。而不是直接将字符串复制到列表中。
这是班级:
namespace ClassLib
{
public class DataBase
{
SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["kassadatabase"].ConnectionString);
public object ScalarObject(string sql)
{
object value = null;
try
{
conn.Open();
SqlCommand cmd = new SqlCommand(sql, conn);
value = cmd.ExecuteScalar();
}
catch (SqlException ex)
{
MessageBox.Show(ex.Message);
}
finally
{
if (conn != null) conn.Close();
}
return value;
}
public List<string> ReaderRdr(string sql)
{
SqlDataReader rdr = null;
List<string> reader = new List<string>();
try
{
conn.Open();
SqlCommand cmd = new SqlCommand(sql, conn);
rdr = cmd.ExecuteReader();
while (rdr.Read())
{
//reader.Add(rdr.GetString(1).ToString().Trim());
}
}
catch (SqlException ex)
{
MessageBox.Show(ex.Message);
}
finally
{
if (rdr != null) rdr.Close();
if (conn != null) conn.Close();
}
return reader;
}
//public List<string> ReaderRdr(string sql, ref string str)
//{
// SqlDataReader rdr = null;
// List<string> reader = new List<string>();
// try
// {
// conn.Open();
// SqlCommand cmd = new SqlCommand(sql, conn);
// rdr = cmd.ExecuteReader();
// while (rdr.Read())
// {
// //MessageBox.Show(str.ToString());
// //var strRdr = str;
// //MessageBox.Show(strRdr.ToString());
// //reader.Add(rdr.GetString(1).ToString().Trim());
// reader.Add(str);
// Console.WriteLine(String.Format("{0}", rdr[0]));
// }
// }
// catch (SqlException ex)
// {
// MessageBox.Show(ex.Message);
// }
// finally
// {
// if (rdr != null) rdr.Close();
// if (conn != null) conn.Close();
// }
// return reader;
//}
public void ExecuteNQuery(string insertString)
{
try
{
conn.Open();
SqlCommand cmd2 = new SqlCommand(insertString, conn);
cmd2.ExecuteNonQuery();
}
catch (SqlException ex)
{
MessageBox.Show(ex.Message);
}
finally
{
if (conn != null) conn.Close();
}
}
}
}
public List<string> ReaderRdr(string sql)
{
SqlDataReader rdr = null;
List<string> reader = new List<string>();
try
{
conn.Open();
SqlCommand cmd = new SqlCommand(sql, conn);
rdr = cmd.ExecuteReader();
while (rdr.Read())
{
//reader.Add(rdr.GetString(1).ToString().Trim());
}
.....
现在在方法公共列表中我要替换//reader.Add(rdr.GetString(1).ToString()。Trim());部分(工作正常)
使用传递给方法的字符串。
public List<string> ReaderRdr(string sql, string strRdr)
{
SqlDataReader rdr = null;
List<string> reader = new List<string>();
try
{
conn.Open();
SqlCommand cmd = new SqlCommand(sql, conn);
rdr = cmd.ExecuteReader();
while (rdr.Read())
{
//reader.Add(strRdr);
}
答案 0 :(得分:1)
我并不是100%肯定你正在尝试做什么,但我现在可以告诉你,这就是你做错了什么 - 字符串(str)你&#39;重新传递给ReaderRdr只是C#代码的字符串文字。你可以用eval()来模仿其他语言中存在的超级hacky(超级不可取)的东西,但是在C#中没有内置的方法可以做到这一点。你没做什么(明智的)&#34;(rdr.GetString(1).ToString()。Trim())&#34;将要获得一个字符串,或将其转换为字符串,或修剪任何东西。
在您的ReaderRdr功能中,您只需将string str
添加到List<string> reader
即可。这不会对您在SqlDataReader
rdr中从数据库查询中获得的结果产生任何影响。如果要存储实际从数据库获取的数据,请使用rdr
,而不是(无用的)字符串参数str.
此外,我觉得你必须在代码中留下一些东西 - 你以SqlCommand cmd
为conn
作为你的第二个论点,但是我没有看到在ReaderRdr方法中的任何位置定义,并且它不是传递给ReaderRdr
的参数。您没有将SqlConnection对象作为班级中的字段或属性,是吗?
就你应该做的事情而言,尽管在你的实际目标方面缺乏很多任何背景 - 如果你想得到SqlDataReader
返回的每一行的结果的任何给定列:
rdr = cmd.ExecuteReader();
while (rdr.Read())
{
var yourDataCell = rdr[yourColumnIndex];
// or:
var yourDataCellOtherWay = rdr["YourColumnName"];
}
或者,您可以遍历SqlDataReader
生成的任何给定行中的每个单元格,如下所示:
for(int i = 0 ; i < numberOfColumns; i++) {
// do something with rdr[i] here
}
我不确定您是否可以根据SqlDataReader的状态建立numberOfColumns,但其他人可能会更清楚。
答案 1 :(得分:0)
您实际上将传递给函数的String添加到阅读器中reader.Add(str);
您可以从SQL rdr
获得响应。
此项目将向您显示数据库中的内容:
Console.WriteLine(String.Format("{0}", rdr[0]));