2010-10-28 3 views
0

Voici mon codecommande SQL ne peut pas être convertie en chaîne

Je semble obtenir une erreur SQL command cannot be converted to string avec ce code

Dim LogData2 As sterm.markdata = New sterm.markdata() 

Dim query As New SqlCommand("Select * from openquery (db, 'SELECT * FROM table WHERE [email protected]')") 
query.Parameters.AddWithValue("@person", Session("number")) 

Dim drCode2a As DataSet = LogData2.StermQ3(query) 

dgBookings.DataSource = drCode2a.Tables(0).DefaultView 
dgBookings.DataBind() 

J'ai essayé d'ajouter dans un Convert.ToString comme celui-ci

Dim drCode2a As DataSet = LogData2.StermQ3(Convert.ToString(query)) 

Et maintenant je reçois cette erreur

Could not find server 'System' in sysservers. Execute sp_addlinkedserver to add the server to sysservers 

Je suis évidemment en train de faire quelque chose de mal, mais je ne sais pas quoi - ASP.Net et SQL est tout nouveau pour moi, toute aide serait très appréciée.

code source de StermQ3

StermQ3(String) As System.Data.DataSet 

Public Function StermQ3(ByVal strSQL6 As String) As System.Data.DataSet 

MISE À JOUR

code source tel qu'il est après quelques modifications ont été apportées

Sub Page_Load(ByVal Sender as Object, ByVal e as EventArgs) 

Dim LogData2 As sterm.markdata = New sterm.markdata() 

Dim query As New SqlCommand("Select * from openquery (db, 'SELECT * FROM table WHERE [email protected]')") 
query.Parameters.AddWithValue("@person", Session("number")) 
query.CommandType = CommandType.StoredProcedure 
query.CommandText = "openquery" 

Dim drCode2a As DataSet = LogData2.StermQ3(Convert.ToString(query)) 

dgBookings.DataSource = drCode2a.Tables(0).DefaultView 
dgBookings.DataBind() 

End Sub 

HTML est

<asp:DataGrid id="dgBookings" runat="server" AutoGenerateColumns="true" ShowHeader="true"> 

</asp:DataGrid> 

chemin Je l'habitude de faire ma requête

Dim query As String = "Select * from openquery (db, 'SELECT * FROM table WHERE investor=''" + Session("number") + "'' ')" 

Cela fonctionne si je remplace mon commandement SQL mais il est ouvert à injection SQL

MISE À JOUR

J'ai maintenant il travailler sans les paramètres bit voici mon code de souce mis à jour toute idée pourquoi il ne va pas ajouter la valeur du paramètre?

Dim conn As SqlConnection = New SqlConnection("server='server1'; user id='w'; password='w'; database='w'; pooling='false'") 
    conn.Open() 


Dim query As New SqlCommand("Select * from openquery (db, 'Select * from table where investor = @investor ') ", conn) 
query.Parameters.AddWithValue("@investor", 69836) 

dgBookings.DataSource = query.ExecuteReader 
dgBookings.DataBind() 

Il fonctionne comme ceci

Dim conn As SqlConnection = New SqlConnection("server='server1'; user id='w'; password='w'; database='w'; pooling='false'") 
    conn.Open() 


Dim query As New SqlCommand("Select * from openquery (db, 'Select * from table where investor = 69836') ", conn) 

dgBookings.DataSource = query.ExecuteReader 
dgBookings.DataBind() 

Toutes les idées?

SOLUTION

Voici comment je résolu mon problème

Dim conn As SqlConnection = New SqlConnection("server='h'; user id='w'; password='w'; database='w'; pooling='false'") 

conn.Open() 

Dim query As New SqlCommand("DECLARE @investor varchar(10), @sql varchar(1000) Select @investor = 69836 select @sql = 'SELECT * FROM OPENQUERY(db,''SELECT * FROM table WHERE investor = ''''' + @investor + ''''''')' EXEC(@sql)", conn) 

dgBookings.DataSource = query.ExecuteReader 
dgBookings.DataBind() 

Merci pour toute l'aide

+0

Avez-vous débogué pour savoir ce que fait StermQ3? Vous passez la référence de chaîne d'un SqlCommand-Object à ce qui pourrait être un non-sens. Je pense que vous avez besoin de sa propriété "CommandText", mais vous avez un problème car vous n'obtenez pas réellement le texte SQL qui est exécuté sur la base de données. Les paramètres sont évalués dans la base de données et non ici. –

Répondre

3

Avez-vous débogué pour savoir ce que fait StermQ3? Vous passez la référence de chaîne d'un SqlCommand-Object à ce qui pourrait être un non-sens. Je pense que vous avez besoin de sa propriété CommandText, mais vous avez un problème car vous n'obtenez pas réellement le texte SQL qui est exécuté sur la base de données. Les paramètres sont évalués dans la base de données et non ici.

Ce que vous pouvez essayer suit:

Dim commandText As String = query.CommandText 
For Each parameter As System.Data.SqlClient.SqlParameter In query.Parameters 
    commandText=commandText.Replace(parameter.ParameterName, parameter.Value.ToString) 
Next 
Dim drCode2a As DataSet = LogData2.StermQ3(commandText) 

Mais je ne pense pas que vous voulez, parce que vous êtes à nouveau ouvert pour SQL-injection (StermQ3 renvoie un DataSet). Je pense que StermQ3 a besoin d'une version surchargée qui prend en paramètre SQLCommand.

EDIT: Je pense que SqlCommand ne sait pas qu'il doit exécuter un StoredProcedure. Définissez sa CommandType et comme CommandText le nom du SP:

query.CommandType = CommandType.StoredProcedure 
query.CommandText = "openquery" 
+0

Je ne sais pas vraiment comment le déboguer - littéralement je ne sais rien à propos de ASP.Net j'ai fait quelques requêtes et c'est à ce sujet que j'ai été jeté dans la partie profonde avec ce truc après qu'un mec a récemment quitté –

+0

Définissez un point d'arrêt dans Visual Studio en cliquant à gauche dans la fenêtre du code source à la ligne que vous souhaitez arrêter (Dim drCode2a As DataSet = LogData2.StermQ3 (requête) ). Puis démarrez l'application et attendez qu'elle s'arrête là. Maintenant, vous pouvez vérifier les variables, etc., en les survolant, ouvrir la fenêtre de surveillance rapide (cliquez avec le bouton droit sur une variable) ou ajouter des montres pour voir directement quand les valeurs changent. http://odetocode.com/Articles/425.aspx –

+0

Je ne semble pas avoir Visual Studio sur mon PC je devine que c'est une nécessité si je vais pouvoir déboguer? –

0

Quelle méthode LogData2.StermQ3 fait? Ma conjecture qu'il enregistre la requête que vous allez exécuter. Si c'est le cas, vous devriez enregistrer votre requête dans une variable différente et la passer à la méthode.

+0

Pour être honnête, je n'ai aucune idée de ce qu'il fait - j'ai repris le travail de quelqu'un d'autre pour le faire comme ils l'ont fait - comment puis-je enregistrer ma requête dans une variable différente et la transmettre? Merci –

+2

Je pense que la meilleure façon de faire quelque chose qui fonctionne bien est de comprendre ce qu'il fait. Donc, vous devriez essayer de trouver ... –

0

Il semble que la fonction prend une requête, ne commande SQL. Effectuez les actions suivantes:

Dim query As String = "Select * from openquery (db, 'SELECT * FROM table WHERE person=" & Session("number") & "')" 
Dim drCode2a As DataSet = LogData2.StermQ3(query) 

dgBookings.DataSource = drCode2a.Tables(0).DefaultView 
dgBookings.DataBind() 

Oui, il ne peut vous empêcher d'injections SQL, de sorte que le mieux que vous pouvez faire dans ce cas est d'utiliser

query = query.Replace("'", "''") 

avant de passer à cette fonction. Dans tous les autres cas, utilisez des requêtes paramétrées.

+0

En faisant cela, il me donne une erreur de syntaxe - sa conversion le '' 'avant' SELECT' en un '' ''et erreur –

+0

Complètement oublié à ce sujet, il suffit d'ignorer la dernière partie de ma réponse then =) Sinon, réécrivez la fonction StermQ3 et faites-la prendre sqlcommand au lieu de la chaîne. –

0

Ok Jamie taylor Je vais essayer de répondre à nouveau à votre question.

Vous utilisez OpenQuery vous êtes probablement becuase utilisez un problème DB

liée Fondamentalement, la méthode est la OpenQuery prend une chaîne vous ne pouvez pas passer une variable dans le cadre de la chaîne que vous avez envoyé à OpenQuery.

Vous pouvez formater votre requête comme ceci à la place. La notation suit servername.databasename.schemaname.tablename. Si vous utilisez un serveur lié via odbc, omettez dataabasename et schemaname, comme illustré ci-dessous.

Dim conn As SqlConnection = New SqlConnection("your SQL Connection String") 
    Dim cmd As SqlCommand = conn.CreateCommand() 
    cmd.CommandText = "Select * db...table where investor = @investor" 
    Dim parameter As SqlParameter = cmd.CreateParameter() 
    parameter.DbType = SqlDbType.Int 
    parameter.ParameterName = "@investor" 
    parameter.Direction = ParameterDirection.Input 
    parameter.Value = 34 
Questions connexes