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 
+1

您的连接字符串指定集成安全性,应使用,但它也指定用户凭据,这没有任何意义。您是否想使用您提供的凭据或以该服务正在运行的用户身份登录? – jmcilhinney

+0

此外,您的代码容易受到SQL注入攻击。使用参数化查询。还有一件事--SqlDataAdapter和SqlCommand都实现了IDisposable接口,你应该在using语句中使用它们。最后一个提示 - 这是我个人的观点 - 不要去vb.net。转到C#。语法的相似之处只会让你感到困惑,因为vb.Net的工作方式与VBA完全不同。 –

+0

@jmcilhinney确定从字符串中删除了用户和密码信息。 Thx家伙的提示,但我仍然不知道如何解决这个问题:( – Radek225

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