变量没有从 SQl 查询中获取数据
Posted
技术标签:
【中文标题】变量没有从 SQl 查询中获取数据【英文标题】:Variable isn't taking the data from the SQl query 【发布时间】:2012-01-09 00:09:37 【问题描述】:我设置了一个 SQL 来查询数据库并查找表中金额的总和,但是它没有返回任何内容,所有数据字段都是正确的,而且查询在运行方式上也是正确的,我认为问题是将它传递给数据读取器的变量,如果有人能纠正这个我会很感激。
这是代码,我觉得和datareader有关:
System.Web.Services.Protocols.SoapException:服务器无法处理请求。 ---
System.Data.OleDb.OleDbException:FROM 子句中的语法错误。在 System.Data.OleDb.OleDbCommand.ExecuteCommandTextForSingleResult(tagDBPARAMS dbParams,对象和执行结果)在 System.Data.OleDb.OleDbCommand.ExecuteCommandText(对象& 执行结果)在 System.Data.OleDb.OleDbCommand.ExecuteCommand(CommandBehavior 行为,对象和执行结果)在 System.Data.OleDb.OleDbCommand.ExecuteReaderInternal(CommandBehavior 行为,字符串方法)在 System.Data.OleDb.OleDbCommand.ExecuteReader(CommandBehavior 行为) 在 HSBC.CheckBal(Int64 帐号) 在 HSBC.CheckBalance(Int64 accountnumber) --- 内部异常堆栈跟踪结束 ---
描述:执行过程中发生了未处理的异常 当前的网络请求。请查看堆栈跟踪以获取更多信息 有关错误的信息以及它在代码中的来源。
异常详细信息:System.Web.Services.Protocols.SoapException: System.Web.Services.Protocols.SoapException:服务器无法 处理请求。 ---> System.Data.OleDb.OleDbException:语法错误 在 FROM 子句中。在 System.Data.OleDb.OleDbCommand.ExecuteCommandTextForSingleResult(tagDBPARAMS dbParams,对象和执行结果)在 System.Data.OleDb.OleDbCommand.ExecuteCommandText(对象& 执行结果)在 System.Data.OleDb.OleDbCommand.ExecuteCommand(CommandBehavior 行为,对象和执行结果)在 System.Data.OleDb.OleDbCommand.ExecuteReaderInternal(CommandBehavior 行为,字符串方法)在 System.Data.OleDb.OleDbCommand.ExecuteReader(CommandBehavior 行为) 在 HSBC.CheckBal(Int64 帐号) 在 HSBC.CheckBalance(Int64 accountnumber) --- 内部异常堆栈跟踪结束 ---
这是被调用的代码。
'Creates a service web method
Private Function CheckBal(ByVal accountnumber As Long) As String
'Database(drivers, connections And commands)
Dim BalanceDr As OleDbDataReader
Dim BalanceConn As OleDbConnection
Dim BalanceCmd As OleDbCommand
'Database connection string
Dim Connx As String = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & Server.MapPath("../database/HSBC.mdb") & ";"
'SQL
Dim SQL As String = "SELECT Transaction_Amount FROM Transaction WHERE Account_Number =" & accountnumber & ";"
Dim bal As String
'Open the connection to the database
BalanceConn = New OleDbConnection(Connx)
BalanceConn.Open()
BalanceCmd = New OleDbCommand(SQL, BalanceConn)
'Create a DataReader that will return information.
BalanceDr = _
BalanceCmd.ExecuteReader(CommandBehavior.CloseConnection)
If BalanceDr.Read() Then
'A row was returned
bal = BalanceDr(0)
Else
'A row was not returned
bal = "No Balance For Account Found"
End If
BalanceDr.Close()
Return SQL
End Function
End Class
【问题讨论】:
应用程序是否对数据库文件夹具有写入权限?没有它,它就无法创建 .ldb 文件,因此没有锁、没有访问权限、没有查询、什么都没有。一步一步打开连接后,检查 /database 文件夹并查看 ldb 文件是否存在。如果不是,则缺少权限。如果它的 web 我不记得它是 I_User 还是 W_User 用于 IIS。 在权限下的数据库中,它已读取设计、修改设计、管理、读取数据、更新数据、插入数据和删除数据,但它说它是以管理员身份运行的。另外我在数据库文件夹中没有 ldb 文件。权限在那里,因为我有另一个正在运行的服务正在保存到数据库和一个外部数据库 连接打开时会创建 .ldb 文件。手动打开 .mdb,您会看到 access 在该文件夹中创建了一个 .ldb。至于权限;如果这是一个网站,您需要 I_USER 或 I_Wuser 对数据库文件夹具有写入权限。无论 Web 服务在哪个帐户下运行,都需要对该文件夹的写入权限。 example 【参考方案1】:问题是Transaction
,也是你数据库中的表名,是保留字;这就是您收到语法错误的原因。
更改您的 SQL 语句以将表名括在方括号中将解决该问题:
Dim SQL As String = "SELECT Transaction_Amount FROM [Transaction] WHERE Account_Number =" & accountnumber & ";"
【讨论】:
【参考方案2】:如何设置权限。
以下是权限如何工作以及服务器管理员需要做些什么来设置权限的快速摘要,以防您感到好奇。
匿名用户通过网络浏览器访问 ASP 页面 当用户通过网络浏览器访问这些页面时,IIS 将(默认情况下)使用名为 iUSR_ 或“everyone”的 Windows NT 帐户。
要设置您必须在服务器上的权限并浏览到数据库所在的文件夹。然后右键单击并选择属性。然后,您授予该帐户更改或修改数据库所在文件夹的权限。更改或修改意味着... r w x d(读/写/执行/删除)。将来,当您将另一个数据库放在同一目录中时,它通常会继承权限,您不必再次询问。如果您删除目录并重新创建它,您将失去它的权限,并且必须重新设置它们。
希望这能让您更好地了解当您的 ASP 脚本和数据库无法正常工作时发生的情况。 SOURCE
选项 2) not sure of jet 将事务视为保留字。试着把它放在[]的
SELECT Transaction_Amount FROM [Transaction] WHERE Account_Number =" & accountnumber & ";"
【讨论】:
以上是关于变量没有从 SQl 查询中获取数据的主要内容,如果未能解决你的问题,请参考以下文章