Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/310.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 无法在C中读取SQL Server数据库_C#_Sql_Sql Server - Fatal编程技术网

C# 无法在C中读取SQL Server数据库

C# 无法在C中读取SQL Server数据库,c#,sql,sql-server,C#,Sql,Sql Server,我目前正在从事一项大学作业,在该作业中,我无法从SQL Server数据库读取数据。我正在尝试读取“牙医姓名”列,然后将这些姓名添加到组合框中 public partial class Dentist_Info : Form { Surgery mySurgery = new Surgery(); private SqlConnection conn; private SqlCommand cmd; private SqlDataAdapter da; S

我目前正在从事一项大学作业,在该作业中,我无法从SQL Server数据库读取数据。我正在尝试读取“牙医姓名”列,然后将这些姓名添加到组合框中

public partial class Dentist_Info : Form
{
    Surgery mySurgery = new Surgery();
    private SqlConnection conn;
    private SqlCommand cmd;
    private SqlDataAdapter da;
    Surgery _formsSurgery;

    public Dentist_Info(Surgery SurgeryToDisplay)
    {
        _formsSurgery = SurgeryToDisplay;
    }

    public void FillCombo()
    {
        SqlConnection conn = new SqlConnection(@"Data Source = GGJG; Initial Catalog = DentistDB; Integrated Security = True");
        SqlCommand SelectCommand = new SqlCommand("SELECT *  FROM DentistInfo", conn);

        SqlDataReader myreader;
        conn.Open();

        try
        {
            myreader = SelectCommand.ExecuteReader();

            while (myreader.Read())
            {
                string dname = myreader.GetString("Dentist Name");
                comboBox1.Items.Add(dname);
            }

            conn.Close();
        }
        catch (Exception ex)
        {
            throw new Exception(ex.Message, ex);
        }
        finally
        {
            if (conn != null)
            {
                conn.Close();
            }
        }
    }
但是,当我输入列名时,它显示一个错误

我的表名为dentistInfo,包含牙医ID、牙医姓名、牙医姓氏、DOB和性别列

最终,当我正确地完成阅读时,当从组合框中选择名称时,我希望能够填充它们的详细信息

public partial class Dentist_Info : Form
{
    Surgery mySurgery = new Surgery();
    private SqlConnection conn;
    private SqlCommand cmd;
    private SqlDataAdapter da;
    Surgery _formsSurgery;

    public Dentist_Info(Surgery SurgeryToDisplay)
    {
        _formsSurgery = SurgeryToDisplay;
    }

    public void FillCombo()
    {
        SqlConnection conn = new SqlConnection(@"Data Source = GGJG; Initial Catalog = DentistDB; Integrated Security = True");
        SqlCommand SelectCommand = new SqlCommand("SELECT *  FROM DentistInfo", conn);

        SqlDataReader myreader;
        conn.Open();

        try
        {
            myreader = SelectCommand.ExecuteReader();

            while (myreader.Read())
            {
                string dname = myreader.GetString("Dentist Name");
                comboBox1.Items.Add(dname);
            }

            conn.Close();
        }
        catch (Exception ex)
        {
            throw new Exception(ex.Message, ex);
        }
        finally
        {
            if (conn != null)
            {
                conn.Close();
            }
        }
    }

专业提示:如果您想询问错误,请发布错误

无论如何,在这种情况下,问题很容易被发现。没有接受字符串作为参数的GetString重载-您只能使用列索引

因此,您需要传递列索引myreader.GetOrdinalDentist名称,或者需要使用索引器stringmyreader[Name]。在这两种情况下,请确保正确处理可能的空值-如果您尝试读取SQL空值,data reader只会引发异常

另一方面,您的try…catch可以简化并更有用:

当你想重新抛出一个异常时,使用throw;没有争论。仅当您有一些信息要添加时才包装异常。 catch子句不是必需的。似乎你只是在最后一次使用它-使用try…finally而不使用catch是非常好的。 conn在finally子句中永远不能为null-您的尝试时间不够长。 对于这样的模式,您希望使用using而不是try…无论如何,最后。您还应该为数据读取器使用。
试试这个:我建议您在牙医名称中添加[],因为它在两个单词之间有一个空格,这可能会导致错误,或者将数据库中的名称更改为DestinstName

public void FillCombo()
    {
        SqlConnection conn = new SqlConnection(@"Data Source = GGJG; Initial Catalog = DentistDB; Integrated Security = True");
        SqlCommand SelectCommand = new SqlCommand("SELECT *  FROM DentistInfo", conn);
        conn.Open();
        DataSet ds = new DataSet();
        SqlDataAdapter da = new SqlDataAdapter(SelectCommand);
        da.fill(ds);

        foreach(DataRow dr in ds.Tables[0].Rows)
        {
            comboBox1.Items.Add(dr["[Dentist Name]"].ToString());
        }
        conn.Close();
    }
根据添加,而不是使用conn.Open和conn.Close,作为第一个用户的答案,您可以使用如下方式将连接包围在一个内部:

using(SqlConnection conn = new SqlConnection(@"Data Source = GGJG; Initial Catalog = DentistDB; Integrated Security = True"))
{
   //your codes here no need for conn.Open() and conn.Close()
}

更改此行字符串dname=myreader.getStringName;到string dname=stringmyreader[牙医姓名];如果我们知道错误是什么,当然会有帮助。列名中有空格,这将在计算SQL查询时引发错误。如果您的数据库是SQL Server,请尝试从DestintInfo中选择[牙医ID]、[牙医姓名]、[牙医姓氏]、DOB、性别。如果是MySQL,则使用严重重音而不是方括号。您需要发布实际的错误消息。这就像去车库说“我的车坏了,修好了”只要你读到可以处理空值的内容,数据读取器就可以读取空值罚款。读取一个对象,检查它是否是字符串,如果是则强制转换。@LorenPechtel,即正确处理可能的空值。GetString和friends将抛出,索引器将返回DBNull.Value。最简单、最便宜的方法就是使用IsDBNull方法。谢谢你的回复。我将确保在任何进一步的问题上附上错误。我回家后将尝试给出的答案。。正如我所理解的,当它遇到一个空值时,是否会发生错误,并且我没有异常this@Griff不,您得到的是编译器错误,而不是异常-没有以列名为参数的GetString重载。再次感谢您的回答。。。我输入了JC Borlagdan提供的代码,但是出现了以下错误:参数1:无法从System.Data.SqlClient.SqlComand转换为字符串。这段代码中有下划线:DataSet ds=new DataSetSelectCommand;括号内的SelectCommand带下划线。非常感谢JC-名称已填充到组合框中-非常感谢您的帮助。很高兴提供帮助,编码愉快!顺便说一下,在从SQL检索数据时,使用DataRow比使用DataTable更快/更高效