webForumDet fria alternativet

Overload resolution failed... (DataAdapter)

5 svar · 1 299 visningar · startad av Pace

PaceMedlem sedan juni 20015 947 inlägg
#1
Public Function dbDataSet (ByVal strSQL As String)
	Dim objAdapter As Object

	Select Case Lcase(DatabaseType)
		Case "sqlserver"
			[red]objAdapter = New SqlDataAdapter(strSQL, objConn)[/red]
		Case "access", "mysql"
			[red]objAdapter = New OleDbDataAdapter(strSQL, objConn)[/red]
		Case Else
			[red]objAdapter = New OdbcDataAdapter(strSQL, objConn)[/red]
		End Select

	Dim objDataSet As New DataSet()
	objAdapter.Fill(objDataSet)

	Return objDataSet
End Function

Det rödmarkerade retunerar följande felmeddelande från vbc.exe. Byter jag plats på parametrarna strSQL och objConn så fungerar det - alltså måste det vara någon slags datatypfel - men vad? :q
objConn är definerad som "public" i klassen.

error BC30519: Overload resolution failed because no accessible 'New' can be called without a narrowing conversion:
'Public Overloads Sub New(selectCommandText As String, selectConnection As System.Data.SqlClient.SqlConnection)': Argument matching parameter 'selectConnection' narrows from 'System.Object' to 'System.Data.SqlClient.SqlConnection'.
'Public Overloads Sub New(selectCommandText As String, selectConnectionString As String)': Argument matching parameter 'selectConnectionString' narrows from
'System.Object' to 'String'.

renholmMedlem sedan apr. 20012 048 inlägg
#2

Skicka med lite kod plus en liten beskrivning vad du försöker göra, tycker det ser ut som om du bygger något som ska klara av olika databas kopplingar, detta finns det en artikel om på msdn har jag för mig, hittar den bara inte nu.

PaceMedlem sedan juni 20015 947 inlägg
#3

Betraktar du inte ovanstående som lite kod? :e

Och ja, det är en class som ska hantera olika kopplingar till databaser.

Alla andra funktioner är bortskalade, men ger samma felmeddelanden:

Namespace blaha
	Public Class PaceDatabase
		Public objConn
		Public DatabaseType As String

		Public Function dbDataSet (ByVal strSQL As String)
			Dim objAdapter As Object
			Select Case Lcase(DatabaseType)
				Case "sqlserver"
					objAdapter = New SqlDataAdapter(strSQL, objConn)
				Case "access", "mysql"
					objAdapter = New OleDbDataAdapter(strSQL, objConn)
				Case Else
					objAdapter = New OdbcDataAdapter(strSQL, objConn)
			End Select

			Dim objDataSet As New DataSet()
			objAdapter.Fill(objDataSet)

			Return objDataSet
		End Function
	End Class

End Namespace
PaceMedlem sedan juni 20015 947 inlägg
#4

Hittade artikeln på msdn du pratade om (tror jag): http://support.microsoft.com/default.aspx?scid=KB;en-us;308046&

Jag testade att skapa databaskopplingen (Dim mycon As New OleDbConnection(myConnString)) före varje DataAdapter och det är tydligen ett måste.

PaceMedlem sedan juni 20015 947 inlägg
#5

Men nu vill jag inte skapa en ny databaskoppling varje gång jag ska hämta en DataAdapter, jag vill låta den befintliga vara öppen och stänga den när jag är klar. Hur gör jag (eller vad gör jag för fel)?

PatrikBMedlem sedan mars 20002 713 inlägg
#6

kanske detta kan vara ngt ;)

<%@ Page Language="VB" Debug="True" %>
<%@ import Namespace="System" %>
<%@ import Namespace="System.Configuration" %>
<%@ import Namespace="System.Data" %>
<%@ import Namespace="System.Data.Oledb" %>
<%@ import Namespace="System.Data.SqlClient" %>
<%@ import Namespace="Microsoft.Data.Odbc" %>
<script runat="server">

    Public Sub Page_Load(sender As Object, e As EventArgs)
    
        Dim db As New DBWrapper()
            db.SetType = "odbc"
            db.ConnectionString = ConfigurationSettings.AppSettings("cwebConnString")
            db.DBConnection()
            db.DBCommand("SELECT * FROM Users")
            
        Dim dr As OdbcDataReader = db.GetDataReader()
        
            While dr.Read()
                Label1.Text = Label1.Text & dr(0) & "<BR />"
            End While
            
            dr.Close()
            
            db.CloseConnection()
    End Sub

    Public Class DBWrapper
    
        Private m_conn As IDbConnection
        Private m_command As IDbCommand
        
        Public SetType As String
        Public ConnectionString As String
        
        Public Sub DBConnection()
            
            Select Case SetType.ToUpper
            
                Case "SQL"
                    m_conn = New SqlConnection(ConnectionString)
                    
                Case "OLEDB"
                    m_conn = New OleDbConnection(ConnectionString)
                    
                Case "ODBC"
                    m_conn = New OdbcConnection(ConnectionString)
                    
            End Select
            
        End Sub
        
        Public Sub DBCommand(ByVal sQuery As String)
            If m_conn.State = ConnectionState.Closed Then m_conn.Open
            Select Case SetType.ToUpper
            
                Case "SQL"
                    m_command = New SqlCommand(sQuery, m_conn)
                    
                Case "OLEDB"
                    m_command = New OledbCommand(sQuery, m_conn)
                    
                Case "ODBC"
                    m_command = New OdbcCommand(sQuery, m_conn) 
            
            End Select
        End Sub
        
        Public Function GetDataReader() As IDataReader
            Dim dr As IDataReader = m_command.ExecuteReader()
            Return dr
            dr.Close()
        End Function
        
        Public Sub CloseConnection()
            If m_conn.State = ConnectionState.Open Then m_conn.Close()
        End Sub
    End Class
</script>
<html>
<head>
</head>
<body>
    <form runat="server">
        <asp:Label id="Label1" runat="server"></asp:Label>
        <!-- Insert content here -->
    </form>
</body>
</html>

ska förståss kodas in i ett namespace och kompileras till en dll .... men, bara för syns skull och för att snabbt kunna testa :e

cya,
PatrikB

Genererad på 394 ms · cache AV · v20260730165559-full.f96bc7eb