2012-06-15 15 views
16

मुझे नीचे पैरामीटर के बाध्यकारी के साथ कोई समस्या है। कनेक्शन काम करता है क्योंकि मैंने पैरामीटर का उपयोग किए बिना इसका परीक्षण किया था। हालांकि, निष्पादित होने से पहले क्वेरी का मूल्य अभी भी 'jsmith' के बजाय 'jusmith' का उपयोग कर रहा है।ओरेकल कॉमांड एसक्यूएल पैरामीटर बाध्यकारी

समस्या क्या है? क्या यह बाध्यकारी के आसपास जाने का सही तरीका नहीं है?

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; 
} 

संपादित करें: मैंने पैरामीटर फ़ील्ड नाम में @ जोड़ा, लेकिन यह अभी भी इसे ठीक नहीं करता है।

उत्तर

52

@ उपयोगकर्ता नाम, के आसपास है और @ के बजाय पैरामीटर नाम के साथ ओरेकल उपयोग : के संबंध में एकल उद्धरण निकालें, जैसे:

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

स्रोत: Using Parameters

+0

यह एक अनुपलब्ध अभिव्यक्ति त्रुटि ORA-00936 देता है। यह डेटाबेस में एक वर्चर है, इसलिए मुझे लगता है कि "'होना चाहिए। –

+0

@RyanSammut, मेरे अपडेट किए गए उत्तर की जांच करें, और जिस लिंक को मैंने पोस्ट किया है – Habib

+1

यह मदद करेगा: http: // stackoverflow।com/प्रश्न/7316850/ओरा-00,936-लापता अभिव्यक्ति-जब-पढ़ने-से-डेटाबेस-साथ-dotConnect चालक। –

-3

आप की आवश्यकता है "@ "प्रतीक:

oraCommand.Parameters.Add(new OracleParameter("@userName", domainUser)); 
+0

मैंने कोशिश की है, यह समस्या नहीं है –

+0

डाउनवॉटर, टिप्पणी करने की देखभाल? – Arran

+3

मैं डाउनवॉटर नहीं हूं, लेकिन कमांड में पैरामीटर जोड़ते समय, आपको बाध्यकारी चरित्र डालने की आवश्यकता नहीं है। इसके अलावा, ओरेकल में बाध्यकारी चरित्र '' '' '' 'नहीं है - यह प्रतीक स्वयं क्वेरी में जाता है। –

1

आपको इस तरह कुछ उपयोग करने की आवश्यकता है:

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

अधिक इस MSDN लेख में पाया जा सकता है: के बजाय चरित्र @ ओरेकल के लिए: http://msdn.microsoft.com/en-us/library/system.data.oracleclient.oraclecommand.parameters%28v=vs.100%29.aspx

यह आप का उपयोग की सलाह दी है।

1
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(); 
14

Oracle SQL-सर्वर से मानकों के लिए एक अलग वाक्य रचना है। नाम वाले पैरामीटर का उपयोग करते समय @

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(); 
    } 
} 

के बजाय एक OracleCommand आप में एक कॉलन (:) के साथ पैरामीटर नाम पूर्व में होना चाहिए: तो का उपयोग करें।

http://msdn.microsoft.com/en-us/library/system.data.oracleclient.oraclecommand.parameters.aspx

0

// पीटी: ईयू ेश्य इस mesmo समस्या Ao utilizar ओ नामस्थान Oracle.DataAccess.Client;

// ES: Tenía este mismo problema cuando se utiliza el नेमस्पेस Oracle.DataAccess.Client;

// EN: Oracle.DataAccess.Client नेमस्पेस का उपयोग करके मुझे यही समस्या थी;

// पीटी: ईयू resolvi desta forma:

// ES:

// एन:: वह डे एस्टा Manera resuelto मैं इसे इस तरह से

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 
} 
संबंधित मुद्दे