将字符串传递给类

本文关键字:字符串 | 更新日期: 2023-09-27 18:28:37

我的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());
            }

现在在methode公共列表中,我想替换//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);
            }

将字符串传递给类

我不能100%确定你想做什么,但我现在可以告诉你,这就是你做错的地方——你传递给ReaderRdr的字符串(str)只是C#代码的字符串文字。你可以做一些非常棘手(非常不可取)的事情来模仿其他语言中的eval(),但在C#中没有内置的方法。对"(rdr.GetString(1).ToString().Trim())"所做的任何(明智的)操作都不会得到字符串,或将其强制转换为字符串,或修剪任何内容。

在ReaderRdr函数中,您所要完成的只是将string str添加到List<string> reader中。这不会起到任何作用,也与您从SqlDataReaderrdr中的数据库查询中获得的结果无关。如果您想存储实际从数据库中获得的数据,请使用rdr,而不是(无用的)字符串参数str.

此外,我觉得你一定在代码中遗漏了一些内容——你正在用conn作为第二个参数实例化SqlCommand cmd,但我看不到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,但其他人可能更清楚。

实际上,您将传递给函数的String添加到读取器reader.Add(str);。您从SQL I获得响应,即rdr

此项目将向您显示数据库中的内容:

Console.WriteLine(String.Format("{0}", rdr[0]));