Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/9.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
Database &引用;“位置0”处没有行;?_Database_Vb.net - Fatal编程技术网

Database &引用;“位置0”处没有行;?

Database &引用;“位置0”处没有行;?,database,vb.net,Database,Vb.net,第一件您做错的事情是存储纯文本密码永远不要存储纯文本密码。 第二件事是,您非常容易受到SQL注入攻击。使用。否则,您将允许用户在您的数据库上任意执行他们想要的任何代码 第三件事是在这里假设一个返回值: Imports System.Data.OleDb Public Class clsDBConnector Dim con As New OleDbConnection Dim dbProvider As String Dim dbSource As String Dim da As OleDbD

第一件您做错的事情是存储纯文本密码永远不要存储纯文本密码。

第二件事是,您非常容易受到SQL注入攻击。使用。否则,您将允许用户在您的数据库上任意执行他们想要的任何代码

第三件事是在这里假设一个返回值:

Imports System.Data.OleDb
Public Class clsDBConnector
Dim con As New OleDbConnection
Dim dbProvider As String
Dim dbSource As String
Dim da As OleDbDataAdapter
Dim ds As New DataSet
Sub connect()
    dbProvider = "PROVIDER=MICROSOFT.ACE.OLEDB.12.0;"
    dbSource = "Data Source = E:\Computing\COMP4\Database.accdb "
    con.ConnectionString = dbProvider & dbSource
    con.Open()
End Sub
Function sqlSelect(ByVal sqlString As String)
    da = New OleDbDataAdapter(sqlString, con)
    da.Fill(ds, "LoginDetails")


    Return ds
End Function
Sub reset()
    ds.Reset()
End Sub
Sub SQLinsert(ByVal sql) 'inserts data into database
    Dim da As New OleDbCommand(sql, Con)
    da.ExecuteNonQuery()
End Sub
Function SQLupdate(ByVal sqlString As String)
    da = New OleDbDataAdapter(sqlString, con)
    da.Fill(ds, "LoginDetails")
    Return ds

End Function
End Class
如果该
SELECT
语句未找到任何值,则
行(i)
i
在本例中为
0
,因为这是
整数的默认值)。在尝试访问它之前,您需要检查
行的计数。在这种情况下,逻辑上,如果
Rows.Count
0
,则找不到用户名/密码组合的匹配项,因此登录失败。通知用户登录失败,并停止执行任何其他操作


第四件你做错的事是存储纯文本密码

在SQL调用后开始使用数据集之前,您应该始终检查是否收到有效/任何返回的数据。调用一个数据集检查方法,就像我包含的方法一样。如果返回false,您就知道SQL返回了一个空数据集。因此,您可以显示一条消息,说明登录信息无效

sql = " SELECT * FROM LoginDetails WHERE UsernameID = '" & TxtUsername.Text & "' AND Password = '" & TxtPassword.Text & "'"
ds = db.sqlSelect(sql)
Dim i As Integer
Dim Username As String = ds.Tables("LoginDetails").Rows(i)("UsernameID")
Dim Password As String = ds.Tables("LoginDetails").Rows(i)("Password")

每次您尝试从数据库中获取信息时,都会使用以下内容:

bool IsEmpty(DataSet dataSet)
{
    foreach(DataTable table in dataSet.Tables)
     {   if (table.Rows.Count != 0) return false; }
   return true;
}
我猜
行(i)
——0处没有行——似乎很明显,请先检查行。
bool IsEmpty(DataSet dataSet)
{
    foreach(DataTable table in dataSet.Tables)
     {   if (table.Rows.Count != 0) return false; }
   return true;
}
If ds.tables("MyTable").rowsCount > 0 then
     // Do the stuff
Else
     // There is no information on the table
End If