webentwicklung-frage-antwort-db.com.de

OracleCommand SQL-Parameterbindung

Ich habe ein Problem mit der Bindung des unten angegebenen Parameters. Die Verbindung funktioniert, weil ich sie ohne Verwendung von Parametern getestet hatte. Der Wert der Abfrage vor der Ausführung verwendet jedoch immer noch '@userName' anstelle von 'jsmith'. 

Worin besteht das Problem? Ist dies nicht der richtige Weg, um verbindlich umzugehen? 

public static String GetFullName(String domainUser)
{
    DataTable dT;
    String fullName = "";

    OracleConnection db = DatabaseAdapter.GetConn();
    db.Open();

    OracleCommand oraCommand = new OracleCommand("SELECT fullname FROM user_profile WHERE domain_user_name = '@userName'", db);
    oraCommand.BindByName = true;
    oraCommand.Parameters.Add(new OracleParameter("@userName", domainUser));

    OracleDataReader oraReader = null;
    oraReader = oraCommand.ExecuteReader();

    if (oraReader.HasRows)
    {
        while (oraReader.Read())
        {
            fullName = oraReader.GetString(0);
        }
    }
    else
    {
        return "No Rows Found";
    }

    oraReader.Close();
    db.Close();
    db.Dispose();

    return fullName;
}

BEARBEITEN: Ich habe @ zum Parameterfeldnamen hinzugefügt, aber es wird immer noch nicht behoben. 

23
Ryan S

Entfernen Sie einfache Anführungszeichen um @Benutzername, und verwenden Sie in Bezug auf Oracle : mit dem Parameternamen anstelle von @ wie:

OracleCommand oraCommand = new OracleCommand("SELECT fullname FROM sup_sys.user_profile
                           WHERE domain_user_name = :userName", db);
oraCommand.Parameters.Add(new OracleParameter("userName", domainUser));

Quelle: Verwenden von Parametern

66
Habib

Oracle hat eine andere Syntax für Parameter als SQL-Server. Verwenden Sie also: anstelle von @

using(var con=new OracleConnection(connectionString))
{
   con.open();
   var sql = "insert into users values (:id,:name,:surname,:username)";

   using(var cmd = new OracleCommand(sql,con)
   {
      OracleParameter[] parameters = new OracleParameter[] {
             new OracleParameter("id",1234),
             new OracleParameter("name","John"),
             new OracleParameter("surname","Doe"),
             new OracleParameter("username","johnd")
      };

      cmd.Parameters.AddRange(parameters);
      cmd.ExecuteNonQuery();
   }
}

Wenn Sie benannte Parameter in einem OracleCommand verwenden, müssen Sie dem Parameternamen einen Doppelpunkt (:) voranstellen.

http://msdn.Microsoft.com/de-de/library/system.data.oracleclient.oraclecommand.parameters.aspx

19
visar_uruqi
string strConn = "Data Source=ORCL134; User ID=user; Password=psd;";

System.Data.OracleClient.OracleConnection con = newSystem.Data.OracleClient.OracleConnection(strConn);
    con.Open();

    System.Data.OracleClient.OracleCommand Cmd = 
        new System.Data.OracleClient.OracleCommand(
            "SELECT * FROM TBLE_Name WHERE ColumnName_year= :year", con);

//for Oracle..it is :object_name and for sql it s @object_name
    Cmd.Parameters.Add(new System.Data.OracleClient.OracleParameter("year", (txtFinYear.Text).ToString()));

    System.Data.OracleClient.OracleDataAdapter da = new System.Data.OracleClient.OracleDataAdapter(Cmd);
    DataSet myDS = new DataSet();
    da.Fill(myDS);
    try
    {
        lblBatch.Text = "Batch Number is : " + Convert.ToString(myDS.Tables[0].Rows[0][19]);
        lblBatch.ForeColor = System.Drawing.Color.Green;
        lblBatch.Visible = true;
    }
    catch 
    {
        lblBatch.Text = "No Data Found for the Year : " + txtFinYear.Text;
        lblBatch.ForeColor = System.Drawing.Color.Red;
        lblBatch.Visible = true;   
    }
    da.Dispose();
    con.Close();
1
rehu

Sie müssen so etwas verwenden:

 OracleCommand oraCommand = new OracleCommand("SELECT fullname FROM sup_sys.user_profile
                       WHERE domain_user_name = :userName", db);

Weitere Informationen finden Sie in diesem MSDN-Artikel: http://msdn.Microsoft.com/en-us/library/system.data.oracleclient.oraclecommand.parameters%28v=vs.100%29.aspx

Es wird empfohlen, das Zeichen : anstelle von @ für Oracle zu verwenden.

1
Xcalibur37

// PT: E tive este mesmo problema ao utilizar o Namensraum Oracle.DataAccess.Client;

// ES: Mehr als ein Problem mit dem Namespace Oracle.DataAccess.Client;

// DE: Ich hatte das gleiche Problem mit dem Oracle.DataAccess.Client-Namespace.

// PT: Eu resolvi desta forma:

// ES: Er resuelto de esta manera:

// DE: Ich habe es so gelöst

using Oracle.DataAccess.Client;

string strConnection = ConfigurationManager.ConnectionStrings["oConnection"].ConnectionString;

dataConnection = new OracleConnectionStringBuilder(strConnection);

OracleConnection oConnection = new OracleConnection(dataConnection.ToString());

oConnection.Open();

OracleCommand tmpCommand = oConnection.CreateCommand();
tmpCommand.Parameters.Add("user", OracleDbType.Varchar2, txtUser.Text, ParameterDirection.Input);
tmpCommand.CommandText = "SELECT USER, PASS FROM TB_USERS WHERE USER = :1";

try
{
    OracleDataReader tmpReader = tmpCommand.ExecuteReader(CommandBehavior.SingleRow);

    if (tmpReader.HasRows)
    {
        // PT: IMPLEMENTE SEU CÓDIGO    
        // ES: IMPLEMENTAR EL CÓDIGO
        // EN: IMPLEMENT YOUR CODE
    }
}
catch(Exception e)
{
        // PT: IMPLEMENTE SEU CÓDIGO    
        // ES: IMPLEMENTAR EL CÓDIGO
        // EN: IMPLEMENT YOUR CODE
}
0
Dominus Farib