webForumDet fria alternativet

Deklarera parameter

3 svar · 300 visningar · startad av Nevvy

NevvyMedlem sedan sep. 200610 inlägg
#1

Hej,
Jag skall deklarera parameter för att kunna hämta selekterad data från en sql-db.
Men jag får meddelande att:
Must declare the variable '@City'.
Trodde det var det jag gjorde i metoderna AddParameters och setParameters
Jag anropar DbRead från webbsidans codeBehind och dbRead skall vara generell och ta emot anrop från alla håll på webbplatsen.
Kan någon se vad felet är?

public DataTable DbRead(string sqlString, string parameter, string value, DbType dbType)
{
SqlConnection dbConnection = CreateConnection();
IDbCommand cmd = dbComm.CreateCommand(sqlString);
AddParameter(cmd, parameter, dbType);

     dbConnection.Open();
     SetParameter(cmd, parameter, value);
     SqlCommand read = new SqlCommand(sqlString, dbConnection);
     DataTable dataTable = new DataTable();
     dataAdapter.SelectCommand = read;
    //här får jag fel Must declare the variable '@City'.         
     dataAdapter.Fill(dataTable);
     dbConnection.Close();
     return dataTable;
}

private System.Data.IDbCommand CreateCommand(string query)
{
return new SqlCommand(query);
}

    private void AddParameter(IDbCommand cmd, string name, DbType type)
    {
        IDbDataParameter param = cmd.CreateParameter();
        param.ParameterName = name;
        param.DbType = type;
        cmd.Parameters.Add(param);
    }

    private void SetParameter(IDbCommand cmd, string name, object value)
    {
        (cmd.Parameters\[name\] as IDbDataParameter).Value = value;
    }
emissionMedlem sedan dec. 19996 721 inlägg
#2

Du sätter parametern på "cmd", men exekverar kommandot "read".

NevvyMedlem sedan sep. 200610 inlägg
#3

dataAdapter.SelectCommand = cmd;???

funkade inte,

F'låt men jag är nybörjare...

echoSweMedlem sedan nov. 20041 189 inlägg
#4
	private void AddParameter([blue]ref[/blue] IDbCommand cmd, string name, DbType type)
	{
		IDbDataParameter param = cmd.CreateParameter();
		param.ParameterName = name;
		param.DbType = type;
		cmd.Parameters.Add(param);
	}

Testa det. Annars får du ge mig hur du bygger din SQL-fråga också. Om det står att den inte deklareras så handlar det om att du inte får in din IDbDataParameter i din IDbCommand.

Din metod, som jag förändrade ovan, gjorde jobb på ett privat object, som inte uppdaterade object-et du skickade med som parameter. "ref" uppdaterar även ditt object, förutsatt att du har initierat det innan du skickar med det.

Sedan har du ju ingen DataAdapter, i alla fall inte i koden du skickade med. Och .Fill(...) stänger själv anslutningen till databasen. Så
dbConnection.Close();
behövs inte.

Men du kan väl skriva "dataAdapter.Dispose();".

Sedan kan du skriva:

	public IDbCommand CreateCommand()
	{
		return objDefaultConn.CreateCommand();
	}

Hellre än

	private System.Data.IDbCommand CreateCommand(string query)
	{
		return new SqlCommand(query);
	}

så blir det lite mer flexibelt.

EDIT:
Förutom det jag har skrivit så skriver du:

dbConnection.Open();

Vilket då inte heller behövs.
Samt:

	AddParameter(cmd, parameter, dbType);

som jag redan har förklarat, varför det inte fungerar, men det fungerar inte av ännu en anledning: att du skapar två Command. Först

		IDbCommand cmd = dbComm.CreateCommand(sqlString);

sedan

		SqlCommand read = new SqlCommand(sqlString, dbConnection);

och använder den senare trots att du (inte) satte parametrar på "cmd"-objektet. (inte = att den inte uppdateras eftersom du inte har ref)

123 ms totalt · 3 externa anrop · v20260731065814-full.30151723
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
120 ms — hämta tråd, inlägg och bilagor (db)