位置0,C#没有行

时间:2014-04-10 01:40:31

标签: c# oracle

Hello Fellow Developers, 我试图从一个函数返回一个数据表,用于我的代码。 它是一个登录表,在那里我有我的员工,并根据雇员我正在进行我的进一步导航。 但问题是每当我尝试触发查询时,查询触发并返回dataTable中的一些值,但是当我尝试访问它时,错误:"位置0和#34处没有行;弹出。

我正在检查DataTable是否为null。

可以在这里找到DatabaseConnection类及其对象创建的初始化和My Function(类声明,构造函数和函数)

public class DatabaseConnection
{
    const string strConnectionString = "DATA SOURCE =dilbert.humber.ca:1521/grok; USER ID =n00993435; PASSWORD= oracle;";
    OracleConnection oracleConnection;
    OracleCommand oracleCommand;
    string query;
    OracleDataReader oracleReader;
    OracleDataAdapter oracleDataAdapter;
    OracleCommandBuilder oracleCommandBuilder;
    DataTable dataTable;

    public DatabaseConnection()
    {
        try
        {
            oracleConnection = new OracleConnection(strConnectionString);
            oracleCommand = new OracleCommand();
            oracleCommand.Connection = oracleConnection;
            oracleCommand.Connection.Open();
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.StackTrace);
        }
    }
public DataTable Login(string u, string p)
    {
        try
        {
            string query = "select employeeid, username, password, firstname, lastname, employeerole from login where username='" + u + "' and password='" + p + "'";
            oracleCommand.CommandText = query;
            oracleDataAdapter = new OracleDataAdapter(oracleCommand);
            dataTable = new DataTable();
            oracleDataAdapter.Fill(dataTable);
            return dataTable;
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message);
            return null;
        }
        finally
        {
            oracleConnection.Close();
        }
    }
}

我的实施:

private void pictureBox1_Click(object sender, EventArgs e)
    {
        if (txtUName.Text == null || txtUName.Text == "")
        {
            MessageBox.Show("Please Enter UserName");
        }
        else if (txtPassword.Text == null || txtPassword.Text == "")
        {
            MessageBox.Show("Please Enter Password");
        }
        else
        {
            string username = txtUName.Text;
            string password = txtPassword.Text;
            DatabaseConnection obj = new DatabaseConnection();
            DataTable dt = new DataTable();
            dt = obj.Login(username, password);
            if (dt == null)
            {
                MessageBox.Show("User with these credentials not found in our Database. Please contact the Admin");
            }
            else
            {
                DataRow row = dt.Rows[0];
                string role = row[5].ToString();
                if (role == "ADMIN")
                {
                    Admin madmin = new Admin();
                    this.Hide();
                    madmin.Show();
                }
            else if (role == "MANAGER")
            {
                BranchManager badmin = new BranchManager();
                this.Hide();
                badmin.Show();
            }
            else if (role == "EMPLOYEE")
            {
                MainBank obj2 = new MainBank();
                obj2.Show();
                this.Hide();

            }
            else
            {
                lblWarning.Visible = true;
                lblWarning.Text = "Invalid Login Credentials.";
                txtUName.BackColor = Color.Red;
                txtPassword.BackColor = Color.Red;
                txtUName.Focus();
            }
            }
        }
    }

在Oracle中正确检索数据: enter image description here

我无法解释为什么会出现这个错误。

这是创建的查询:"select employeeid, username, password, firstname, lastname, employeerole from login where username='ADMIN' and password='ADMIN'"这个对我来说似乎很好,因为我试图在编辑器上运行相同的它并且它有效!有什么我想念的吗?

enter image description here

提前致谢!

4 个答案:

答案 0 :(得分:3)

看起来数据库中没有记录会导致空DataTable,而不是null

检查以确保在尝试访问它之前至少有一行。

if (dt.Rows.Count == 0)
{
    MessageBox.Show("User with these credentials not found in our Database. Please contact the Admin");
}

你有一些在你的Login方法之外定义的东西,它们可能都在其中定义,所以你可以更加放心,没有其他因素会对你与数据库的连接产生负面影响。

这是未经测试的,但应该有效。我参数化了你的查询,并删除了try / catch。 (如果有任何例外情况,请在您呼叫Login的任何事件或方法中处理它们。)

public DataTable Login(string u, string p)
{
    var dataTable = new DataTable();

    var connectionString = "whatever";  // change this obviously :)
    var query = "select employeeid, username, password, firstname, lastname, employeerole from login where username = :username and password = :password";

    using (var oracleConnection = new OracleConnection(connectionString))
    {
        oracleConnection.Open();

        using (var oracleCommand = new OracleCommand(query, oracleConnection))
        {
            oracleCommand.Parameters.AddWithValue("username", u);
            oracleCommand.Parameters.AddWithValue("password", p);

            using (var oracleDataAdapter = new OracleDataAdapter(oracleCommand))
            {
                oracleDataAdapter.Fill(dataTable);
            }
        }

        oracleConnection.Close();
    }

    return dataTable;
}

答案 1 :(得分:1)

正如消息所示,您的数据表中没有行,因此当您尝试索引0时,它会失败。

您需要确保从登录功能正确填充数据表。

为避免错误,您只需检查是否已返回行。

if (dt != null && dt.Rows.Any()) {
   // it has results.
}

答案 2 :(得分:0)

dt == null仅检查DataTable是否为空。 你应该检查dt.Rows.Count == 0.

if (dt == null || dt.Rows.Count == 0)

如果它为零则表示您的查询未返回任何结果。

答案 3 :(得分:0)

谢谢大家! 我找到了答案,这对我很傻.. :( 添加插入查询后我没有提交它..因此C#代码计数找到它.. 提交后,正确检索查询! :) 非常感谢您的快速反应!

所有冰雹开发者!