2012-08-16 110 views
1

我有我奮力創建WCF服務申請表這個數據訪問層的一個問題:WCF從數據訪問層

public class DataAccess 
{ 
    private SqlConnection connection = new SqlConnection("Data Source=LAPI;Initial Catalog=PrimierData;Integrated Security=True"); 
    private SqlDataReader dataReader; 
    private SqlCommand command; 
    private SqlTransaction transaction = null; 
    private SqlParameter[] parameters = null; 


    #region Conenction 
    public void Open() 
    { 
     if (connection.State != ConnectionState.Open) 
      connection.Open(); 
    } 

    public void Close() 
    { 
     if (connection.State != ConnectionState.Closed) 
      connection.Close(); 
    } 

    #endregion 




    #region Reader 
    /// <summary> 
    /// Executes the reader. For MultiRow Search 
    /// </summary> 
    /// <param name="commandType">Type of the command.</param> 
    /// <param name="commandText">The command text.</param> 
    /// <returns></returns> 
    public SqlDataReader ExecuteReader(CommandType commandType, string commandText,SqlParameter[] readerparams) 
    { 
     Open(); 
     command = new SqlCommand(commandText, connection); 
     command.CommandType = commandType; 
     if (readerparams != null) 
     { 
      command.Parameters.AddRange(readerparams); 
     } 
     this.dataReader = command.ExecuteReader(); 
     command.Parameters.Clear(); 
     // Close(); 
     return this.dataReader; 
    } 

    #endregion 

    #region Execute 
    /// <summary> 
    /// Executes the non query. For Insert, Update and Delete 
    /// </summary> 
    /// <param name="commandType">Type of the command.</param> 
    /// <param name="commandText">The command text.</param> 
    /// <param name="parameters">The parameters.</param> 
    /// <returns></returns> 
    public int ExecuteNonQuery(CommandType commandType, string commandText,SqlParameter[] nonparams) 
    { 
     Open(); 
     command = new SqlCommand(commandText, connection); 
     command.CommandType = commandType; 
     command.Parameters.AddRange(nonparams); 
     int returnValue = command.ExecuteNonQuery(); 
     command.Parameters.Clear(); 
     Close(); 
     return returnValue; 
    } 

    #endregion 

} 

我想使用WCF,但我得到一個錯誤

無法添加服務。服務元數據可能無法訪問。確保您的服務正在運行並展示元數據。

而我試圖編碼它,我努力失敗。我使用的代碼工作,但創建WCF時,我是一個complte noob。

[ServiceContract] 
public interface IService1 
{ 


    // TODO: Add your service operations here 
    [OperationContract] 
    void Open(); 

    [OperationContract] 
    void Close(); 


    [OperationContract] 
    SqlDataReader ExecuteReader(CommandType commandType, string commandText, SqlParameter[] readerparams); 

    [OperationContract] 
    int ExecuteNonQuery(CommandType commandType, string commandText, SqlParameter[] nonparams); 
} 

和我Service.svc

public class Service1 : IService1 
{ 
    private SqlConnection connection = new SqlConnection("Data Source=LAPI;Initial Catalog=PrimierData;Integrated Security=True"); 
    private SqlDataReader dataReader; 
    private SqlCommand command; 
    private SqlTransaction transaction = null; 
    private SqlParameter[] parameters = null; 


    [OperationContract] 
    public void Open() 
    { 
     if (connection.State != ConnectionState.Open) 
      connection.Open(); 
    } 

    [OperationContract] 
    public void Close() 
    { 
     if (connection.State != ConnectionState.Closed) 
      connection.Close(); 
    } 

    [OperationContract] 
    public int ExecuteNonQuery(CommandType commandType, string commandText, SqlParameter[] nonparams) 
    { 
     Open(); 
     command = new SqlCommand(commandText, connection); 
     command.CommandType = commandType; 
     command.Parameters.AddRange(nonparams); 
     int returnValue = command.ExecuteNonQuery(); 
     command.Parameters.Clear(); 
     Close(); 
     return returnValue; 
    } 
    [OperationContract] 
    public SqlDataReader ExecuteReader(CommandType commandType, string commandText, SqlParameter[] readerparams) 
    { 
     Open(); 
     command = new SqlCommand(commandText, connection); 
     command.CommandType = commandType; 
     if (readerparams != null) 
     { 
      command.Parameters.AddRange(readerparams); 
     } 
     this.dataReader = command.ExecuteReader(); 
     command.Parameters.Clear(); 
     // Close(); 
     return this.dataReader; 
    } 
+1

我看不出有任何WCF服務代碼...如果此代碼可以更好地顯示什麼不起作用... – rene 2012-08-16 08:15:28

+0

您是否嘗試將WCF服務參考添加到您的D AL?你必須更具體,所以我們可以幫助你。 – 2012-08-16 08:23:29

+0

是的,我試圖引用一個DAL對不起,因爲這是非特定的。我的第一篇文章。我現在將添加錯誤代碼。 – J03Fr0st 2012-08-16 08:47:36

回答

0

好的,我自己也是這樣,它爲我工作。 在客戶端DAL

public SQLArray[] SQLtoArray(SqlParameter[] parama) 
    { 
     if (parama != null) 
     { 
      SqlParameter[] param = parama; 
      int lenght = param.Count(); 
      SQLArray[] unner = new SQLArray[lenght]; 

      for (int i = 0; i < lenght; i++) 
      { 
       unner[i] = new SQLArray(); 
       unner[i].ParamaterName = param[i].ParameterName; 
       unner[i].Paramatertype = param[i].SqlDbType; 
       unner[i].ParamaterDirection = param[i].Direction; 
       unner[i].ParamaterValue = param[i].Value.ToString(); 
      } 
      return unner; 
     } 
     return null; 
    } 

和服務器端

接口

[ServiceContract] 
[ServiceKnownType(typeof(SqlParameter[]))] 
[ServiceKnownType(typeof(object))] 
[ServiceKnownType(typeof(SqlDbType))] 
[ServiceKnownType(typeof(ParameterDirection))] 
[ServiceKnownType(typeof(SqlDateTime))] 
public interface IServerService 
{ 
    [OperationContract] 
    DataSet ExecuteDataSet(CommandType commandType, string commandText, SQLArray[] dsparams); 

    [OperationContract] 
    int ExecuteNonQuery(CommandType commandType, string commandText, SQLArray[] nonparams); 


} 
[DataContract] 
[KnownType(typeof(SqlParameter[]))] 
[KnownType(typeof(object))] 
[KnownType(typeof(SqlDbType))] 
[KnownType(typeof(ParameterDirection))] 
[KnownType(typeof(SqlDateTime))] 
public class SQLArray 
{ 
    // private SqlParameter[] array; 
    private string paramaterName; 
    private string paramaterValue; 
    private ParameterDirection paramaterDirection; 
    private SqlDbType paramatertype; 


    [DataMember] 

    public string ParamaterName 
    { 
     get { return paramaterName; } 
     set { paramaterName = value; } 
    } 
    [DataMember] 
    public string ParamaterValue 
    { 
     get { return paramaterValue; } 
     set { paramaterValue = value; } 
    } 
    [DataMember] 
    public ParameterDirection ParamaterDirection 
    { 
     get { return paramaterDirection; } 
     set { paramaterDirection = value; } 
    } 
    [DataMember] 
    public SqlDbType Paramatertype 
    { 
     get { return paramatertype; } 
     set { paramatertype = value; } 
    } 
} 

CSV

[Serializable] 
public class ServerService : IServerService 
{ 
    #region Class Members 

    // private ServerDataAccess dataAccess; 
    SqlConnection connection = new SqlConnection("Data Source=LAPI;Initial Catalog=PrimierData;Integrated Security=True"); 
    // SqlDataReader dataReader; 
    SqlCommand command; 
    // SqlTransaction transaction = null; 
    // SqlParameter[] parameters = null; 

    #endregion 

    #region Constructor 

    public ServerService() 
    { 


    } 
    public SqlParameter[] ArrayToSQL(SQLArray[] parama) 
    { 
     // bool outahere = false; 
     int count = 0; 
     foreach (SQLArray array in parama) 
      count++; 
     SqlParameter[] unner = new SqlParameter[count]; 
     for (int i = 0; i < count; i++) 
     { 
      unner[i] = new SqlParameter(); 
      unner[i].ParameterName = parama[i].ParamaterName; 
      unner[i].SqlDbType = parama[i].Paramatertype; 
      unner[i].Direction = parama[i].ParamaterDirection; 
      unner[i].Value = parama[i].ParamaterValue; 
     } 
     return unner; 
    } 
    public SQLArray[] SQLtoArray(SqlParameter[] parama) 
    { 
     int count = 0; 
     foreach (SqlParameter parameter in parama) 
      count++; 
     SQLArray[] unner = new SQLArray[count]; 

     for (int i = 0; i < parama.Count(); i++) 
     { 
      unner[i] = new SQLArray(); 
      unner[i].ParamaterName = parama[i].ParameterName; 
      unner[i].Paramatertype = parama[i].SqlDbType; 
      unner[i].ParamaterDirection = parama[i].Direction; 
      unner[i].ParamaterValue = parama[i].Value.ToString(); 
     } 
     return unner; 
    } 
    #endregion 

    public void Open() 
    { 
     if (connection.State != ConnectionState.Open) 
      connection.Open(); 
    } 

    public void Close() 
    { 
     if (connection.State != ConnectionState.Closed) 
      connection.Close(); 
    } 

    #region Methods 
    /// <summary> 
    /// Executes the non query. For Insert, Update and Delete 
    /// </summary> 
    /// <param name="commandType">Type of the command.</param> 
    /// <param name="commandText">The command text.</param> 
    /// <param name="parameters">The parameters.</param> 
    /// <returns></returns> 
    public int ExecuteNonQuery(CommandType commandType, string commandText, SQLArray[] nonparams) 
    { 
     Open(); 
     command = new SqlCommand(commandText, connection); 
     command.CommandType = commandType; 
     command.Parameters.AddRange(ArrayToSQL(nonparams)); 
     int returnValue = command.ExecuteNonQuery(); 
     command.Parameters.Clear(); 
     Close(); 
     return returnValue; 
    } 
    public DataSet ExecuteDataSet(CommandType commandType, string commandText, SQLArray[] dsparams) 
    { 

      Open(); 
      command = new SqlCommand(commandText, connection); 
      command.CommandType = commandType; 
      if (dsparams != null) 
      { 
       command.Parameters.AddRange(ArrayToSQL(dsparams)); 
      } 
      SqlDataAdapter dataAdapter = new SqlDataAdapter(); 
      dataAdapter.SelectCommand = command; 
      DataSet dataSet = new DataSet(); 
      dataAdapter.Fill(dataSet); 
      command.Parameters.Clear(); 
      Close(); 

      return dataSet; 



    } 
0

SqlDataReader不能XML序列化。基於服務的應用程序中的客戶端應用程序不應該瞭解有關數據庫和相關操作的任何信息我建議創建類和對象,服務將使用它們來發送和接收數據。

+1

你的意思是不應該? – KingCronus 2012-08-16 09:06:38

+0

@KingCronus哦,是的。更新迴應。 – danish 2012-08-16 09:09:56