c#SqlDataReader没有找到值

时间:2017-08-30 21:34:52

标签: c# sqlcommand

我的问题已修复,我的主要问题是从xaml中的文本框中获取信息,该信息在该窗口关闭后被删除,另一个打开。虽然答案确实解决了我的其他问题,并使我的代码更简单,更容易阅读。非常感谢你!

所以我目前正致力于为个人项目构建日历并致力于向数据库添加事件,此事件表存储两个varchars和一个int(名称,描述,用户ID),userid是外键并链接到用户表。当我使用下面的代码尝试拉出该用户输入的用户名时,它会告诉我没有现有值。

using (SqlConnection connection = new SqlConnection())
        {

            connection.ConnectionString =
                    "Data Source=calenderserver.database.windows.net;" +
                    "Initial Catalog=Calender;" +
                    "User id=*******;" +
                    "Password=*******;" +
                    "MultipleActiveResultSets = true";
            connection.Open();

            SqlCommand com = new SqlCommand("Select UserId from Users Where UserName = @user", connection);
            com.Parameters.AddWithValue("@user", UsernameTextBox.Text);

            SqlDataReader reader = com.ExecuteReader();
            reader.Read();
            int userid = reader.GetInt32(1);

            messages.Text = "Event Added";
            SqlCommand command = new SqlCommand("INSERT INTO [Events] VALUES (@eventname, @eventdesc)", connection);
            command.Parameters.AddWithValue("@eventname", name);
            command.Parameters.AddWithValue("@eventdesc", description);
            command.Parameters.AddWithValue("@userid", userid);
            command.ExecuteNonQuery();

            reader.Close();
            connection.Close();

        }

即使我在实际的SQL Query中运行相同的命令,它也会返回一个正确的值。

SQL Command

我完全迷失了,并检查了多个来源和解决方案,非常感谢您的帮助。

4 个答案:

答案 0 :(得分:2)

你正在做int userid = reader.GetInt32(1); get函数的索引是0,所以你实际上需要int userid = reader.GetInt32(0);所以你得到第一列。

话虽如此,因为您使用的是第一列的第一个结果,您可以通过从数据读取器切换到使用ExecuteScalar()来简化代码

        SqlCommand com = new SqlCommand("Select UserId from Users Where UserName = @user", connection);
        com.Parameters.AddWithValue("@user", UsernameTextBox.Text);

        int userid = (int)com.ExecuteScalar();

答案 1 :(得分:1)

尝试使用ExecuteScalar函数。执行标量返回单个值,我看到您只需要用户ID。 看一下这个link

int userid = (Int32)com.ExecuteScalar();

我希望它有所帮助!

答案 2 :(得分:1)

GetInt32中的指标从0开始为per doc,因此您的调用应为:

int userid = reader.GetInt32(0);

答案 3 :(得分:1)

更改这些行:

        SqlDataReader reader = com.ExecuteReader();
        reader.Read();
        int userid = reader.GetInt32(1);

为:

var userID = com.ExecuteScalar();

为什么:

当您的查询返回单个值时,应使用

执行标量

执行Reader 以DataReader的形式返回数据集合。 DataReader很快,您可以快速迭代它们以从数据库中获取所需的数据。只要datareader打开,连接就会保持打开状态。

因为您只从数据库中获取单个值,所以使用ExecuteScalar是有意义的。它更高效,也更重要。

如果您获得了UserID列表,那么我建议您使用DataReader迭代UserID。