WCF服务使用ADO.NET VB.NET从SQL Server获取DATA
问题描述:
我已将WCF服务附加到我的示例网站。
除了使用SQL查询从SQL服务器获取数据之外,WCF函数可以正常工作。
我对VB.NET不是很熟悉,我的经验来自VBA,它很相似,但设置查询是完全不同的。WCF服务使用ADO.NET VB.NET从SQL Server获取DATA
起初我试着用SqlDataReader
,然后SqlDataAdapter
- 结果相同。我的服务卡住了。
Visual Studio显示SQL Server无法传递数据的错误,因为存在内部错误。
这很奇怪,因为当我在Visual Studio中使用“WCF Test Client”时,那么这两个函数都可以正常工作并接收正确的数据。另外,当我将这个功能直接附加到我的网站上也很好。问题是由WCF使用它们。
下面是我用的SqlDataAdapter
Public Function GetCookiesPriceDS(ByVal nameOfCookie As String) _
As DataSet Implements IService1.GetCookiesPriceDS
Dim queryString As String
Dim dataSet As DataSet = New DataSet("temporary")
queryString = "select CookiesPrice from " &
"tblCookies where CookiesName='" & nameOfCookie & "'"
Using connection As New SqlConnection _
("Server= xyz\SQLEXPRESS; Database = Cookies2; " &
"Integrated Security = true;User Id = xyz;Password = xyz")
Dim adapter As New SqlDataAdapter()
adapter.SelectCommand = New SqlCommand(queryString, connection)
adapter.Fill(dataSet)
Return dataSet
End Using
End Function
答
OK功能,我发现在vb.net一些示例代码,并做了一些小的变化。它不起作用,因为在“WCF Test Client”中红色符号出现在函数旁边,并带有注释 - “此操作在WCF Test Client中不受支持,因为它使用WcfService.CookiesData类型”但尽管如此,我认为此代码更好比我以前的版本更好,并有更好的定义。但还是有一些问题,我无法弄清楚什么是错的
Imports System.Data.SqlClient
Imports System.Data
Imports System.Configuration
Imports System.ServiceModel
Imports System.Runtime.Serialization
Public Class Service1
Implements IService1
Public Function GetCookiesPriceDS(ByVal nameOfCookie As String) _
As CookiesData Implements IService1.GetCookiesPriceDS
Using con As New SqlConnection("Server= xyz\SQLEXPRESS; Database = Cookies2; " &
"Integrated Security = true;")
Using cmd As New SqlCommand("select CookiesPrice from tblCookies where CookiesName='" & nameOfCookie & "'")
Using sda As New SqlDataAdapter()
cmd.Connection = con
sda.SelectCommand = cmd
Using dt As New DataTable()
Dim ck As New CookiesData()
sda.Fill(ck.CustomersTable)
Return ck
End Using
End Using
End Using
End Using
End Function
End Class
<ServiceContract()>
Public Interface IService1
<OperationContract()>
Function GetCookiesPriceDS(ByVal nameOfCookie As String) As CookiesData
End Interface
<DataContract()>
Public Class CookiesData
Public Sub New()
CustomersTable = New DataTable("TblCookies")
End Sub
<DataMember()>
Public Property CustomersTable() As DataTable
End Class
您的连接字符串指定集成安全性,应使用,但它也指定用户凭据,这没有任何意义。您是否想使用您提供的凭据或以该服务正在运行的用户身份登录? – jmcilhinney
此外,您的代码容易受到SQL注入攻击。使用参数化查询。还有一件事--SqlDataAdapter和SqlCommand都实现了IDisposable接口,你应该在using语句中使用它们。最后一个提示 - 这是我个人的观点 - 不要去vb.net。转到C#。语法的相似之处只会让你感到困惑,因为vb.Net的工作方式与VBA完全不同。 –
@jmcilhinney确定从字符串中删除了用户和密码信息。 Thx家伙的提示,但我仍然不知道如何解决这个问题:( – Radek225