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中正确检索数据:
我无法解释为什么会出现这个错误。
这是创建的查询:"select employeeid, username, password, firstname, lastname, employeerole from login where username='ADMIN' and password='ADMIN'"
这个对我来说似乎很好,因为我试图在编辑器上运行相同的它并且它有效!有什么我想念的吗?
提前致谢!
答案 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#代码计数找到它.. 提交后,正确检索查询! :) 非常感谢您的快速反应!
所有冰雹开发者!