J'écris une class de Connection
personnalisée en C # pour Excel pour être en mesure de se connecter à un server SQL. Lorsque j'utilise SQLConnection
partir de la bibliothèque System.Data.SqlClient
, je suis en mesure d'établir une connection. Le code de travail que j'ai:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Data.SqlClient; using System.Runtime.InteropServices; namespace Test { [InterfaceType(ComInterfaceType.InterfaceIsDual), Guid("6E8B9F68-FB6C-422F-9619-3BA6D5C24E84")] public interface IConnection { bool Status { get; } bool Open(); } [ClassInterface(ClassInterfaceType.None)] [Guid("B280EAA4-CE11-43AD-BACD-723783BB3CF2")] [ProgId("Test.Connection")] public class Connection : IConnection { private bool status; private SqlConnection conn; private ssortingng connSsortingng = "Data Source=[server]; Initial Catalog=[initial]; User ID=[username]; Password=[password]"; public Connection() { } public bool Status { get { return status; } } public bool Open() { try { conn = new SqlConnection(connSsortingng); conn.Open(); status = true; return true; } catch(Exception e) { e.ToSsortingng(); return false; } } } }
Et après avoir ajouté la reference à Excel, je suis en mesure de tester la connection en utilisant un simple code VBA comme ceci:
Sub TestConnection() Dim conn As Test.Connection Set conn = New Test.Connection Debug.Print conn.Status conn.Open Debug.Print conn.Status End Sub
Il produit:
Faux
Vrai
- Pourquoi le jeu d'loggings renvoyé par cette requête a-t-il le statut "fermé"?
- VBScript – Récupération d'une valeur scalaire à partir d'une procédure stockée sur SQL Server 2008
- SQL Datepart où Clause ne fonctionne pas
- Pourquoi le paramètre adParamOutput ne contient pas de valeur après l'exécution
- login à SQL Server sur un réseau à l'aide d'ADO à partir d'Excel VBA
Alors tout va bien. Maintenant, je voudrais créer une class Recordset
personnalisée dans ma bibliothèque C # donc j'ai décidé d'utiliser une bibliothèque RecordSet
et son RecordSet
au lieu de SqlDataReader
comme je SqlDataReader
de travailler avec de gros morceaux de données. J'ai donc modifié mon code pour ceci:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Data.SqlClient; using System.Runtime.InteropServices; namespace Test { [InterfaceType(ComInterfaceType.InterfaceIsDual), Guid("6E8B9F68-FB6C-422F-9619-3BA6D5C24E84")] public interface IConnection { bool Status { get; } bool Open(); } [ClassInterface(ClassInterfaceType.None)] [Guid("B280EAA4-CE11-43AD-BACD-723783BB3CF2")] [ProgId("Test.Connection")] public class Connection : IConnection { private bool status; private ADODB.Connection conn = new ADODB.Connection(); private ssortingng connSsortingng = "Data Source=[server]; Initial Catalog=[initial]; User ID=[username]; Password=[password]"; public Connection() { } public bool Status { get { return status; } } public bool Open() { try { conn.ConnectionSsortingng = connSsortingng; conn.Open(); // conn.Open(connSsortingng, ["username"], ["password"], 0) // what else can I try? is this where it actually fails? status = true; return true; } catch (Exception e) { e.ToSsortingng(); return false; } } } }
J'ai également ajouté des references à Microsoft ActiveX Data Objects 6.1 Library
.
Maintenant, lorsque j'exécute le code VBA, il affiche:
0
0
Mais je m'attendais à 0
et 1
. Il me semble que je ne me connecte pas correctement au server (les informations d'identification sont les mêmes que je viens de supprimer datatables réelles de ce code) .
J'ai essayé d'utiliser différentes variantes de la string de connection, mais elle renvoie toujours 0
et 0
. J'ai essayé de créer un nouveau projet avec de nouveaux GUID et j'ai essayé de renommer les projets, les classs, etc. rien n'a fonctionné. Je suspecte son établissement de la connection mais je ne sais pas comment déboguer une DLL.
J'ai utilisé link1 , link2 , link3 , link4 comme reference
Mettre à jour:
J'ai écrit l'exception au file comme suggéré par TheKingDave. Ceci est le message d'erreur d'exception
System.Runtime.InteropServices.COMException (0x80004005): [Microsoft] [Gestionnaire de pilotes ODBC] Nom de la source de données introuvable et aucun pilote par défaut spécifié à ADODB._Connection.Open (Chaîne ConnectionSsortingng, ID user string, Mot de passe string, Options Int32) à TestADODB .Connection.Open () dans c: \ Users \ administrateur \ Documents \ Visual Studio 2012 \ Projects \ Test \ Test \ Connection.cs: ligne 49
La string de connection est manquante Provider=SQLOLEDB
.
ADODB.Connection doit connaître le type de database auquel il se connecte.