2012-06-15 20 views
16

Tôi gặp vấn đề với sự ràng buộc của tham số bên dưới. Kết nối hoạt động vì tôi đã thử nghiệm nó mà không cần sử dụng các tham số. Tuy nhiên, giá trị của truy vấn trước khi được thực thi vẫn đang sử dụng '@userName' thay vì 'jsmith' chẳng hạn.OracleCommand SQL Parameters Binding

Sự cố là gì? Đây không phải là cách đúng đắn để đi xung quanh ràng buộc?

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

EDIT: Tôi đã thêm @ vào tên trường thông số, nhưng nó vẫn không sửa lỗi.

Trả lời

52

Di chuyển dấu nháy đơn xung quanh @username, và đối với oracle sử dụng : với tên tham số thay vì @ với, như:

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

Nguồn: Using Parameters

+0

Điều đó trả về lỗi biểu thức bị thiếu ORA-00936. Đó là một varchar trong cơ sở dữ liệu, vì vậy nó cần phải có '', tôi giả sử. –

+0

@RyanSammut, kiểm tra câu trả lời cập nhật của tôi và liên kết tôi đã đăng – Habib

+1

Có thể nó sẽ giúp: http: // stackoverflow.com/questions/7316850/ora-00936-missing-expression-khi-đọc-từ-cơ sở dữ liệu-với-dotconnect-driver. –

-3

Bạn cần phải có "@ "symbol:

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

Tôi đã thử rằng, điều đó dường như không phải là vấn đề –

+0

Downvoter, chăm sóc bình luận? – Arran

+3

Tôi không phải là downvoter, nhưng khi thêm tham số vào Command, bạn không cần phải đặt ký tự ràng buộc. Hơn nữa, các ký tự ràng buộc trong Oracle là ':' không '@' - biểu tượng này đi vào truy vấn chính nó. –

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 có cú pháp khác cho tham số hơn Sql-Server. Vì vậy, sử dụng: thay vì @

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

Khi sử dụng các tham số có tên trong OracleCommand, bạn phải đặt trước tên tham số bằng dấu hai chấm (:).

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

0

// PT: Eu chính kịp thời este mesmo problema ao utilizar o Namespace Oracle.DataAccess.Client;

// ES: Tenía este mismo problema cuando se utiliza el Không gian tên Oracle.DataAccess.Client;

// EN: Tôi đã có cùng một vấn đề này bằng cách sử dụng không gian tên Oracle.DataAccess.Client;

// PT: Eu resolvi desta forma:

// ES: Ông resuelto de esta manera:

// EN: Tôi giải quyết nó theo cách này

sử dụng 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 
}