Calling WCF Webservice from Excel VBA using GetObject() method
本问题已经有最佳答案,请猛点这里访问。
Possible Duplicate:
How do I call WCF client from Excel 2003 VBA?
我想调用一个使用WCF从Excel使用VBA代码开发的Web服务。我们怎么做?我已经尝试过
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | [DataContract] public class Data { [DataMember] public int Id; [DataMember] public DateTime LockTime; [DataMember] public DateTime LoginTime; [DataMember] public DateTime LastDefenitionDate; [DataMember] public string NTLogin; [DataMember] public string SystemName; } |
服务合同如下:
`
1 2 3 4 5 6 7 8 9 | [ServiceContract] interface IDataService { [OperationContract] List<Data> GetData(); [OperationContract] void SubmitData(Data data); } |
`
访问数据库的数据服务如下:
`
[服务行为(InstanceContextMode=InstanceContextMode.Single)]
公共类数据服务:IDataService{public static sqlconnection sqldconnection=new sqlconnection();
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 | #region IDataService Members public List<Data> GetData() { List<Data> datas = new List<Data>(); try { if (SQLDBConnection.con.State == ConnectionState.Closed) SQLDBConnection.con.Open(); datas.Clear(); SqlCommand sqlcommand = new SqlCommand(); sqlcommand.Connection = SQLDBConnection.con; sqlcommand.CommandText ="select * from tblData"; sqlcommand.CommandType = CommandType.Text; SqlDataAdapter sqladapter = new SqlDataAdapter(sqlcommand); DataTable dt = new DataTable(); sqladapter.Fill(dt); Data data = null; for (int i = 0; i < dt.Rows.Count; i++) { data = new Data(); data.Id = Convert.ToInt32(dt.Rows[i]["id"]); data.NTLogin = dt.Rows[i]["NTLogin"].ToString(); data.SystemName = dt.Rows[i]["SystemName"].ToString(); data.LockTime = Convert.ToDateTime(dt.Rows[i]["LockTime"]); data.LoginTime = Convert.ToDateTime(dt.Rows[i]["LoginTime"]); data.LastDefenitionDate = Convert.ToDateTime(dt.Rows[i]["LastDefenitionDate"]); datas.Add(data); } } catch (Exception ex) { } return datas; } public void SubmitData(Data data) { if (SQLDBConnection.con.State == ConnectionState.Closed) SQLDBConnection.con.Open(); SqlCommand sqlcommand = new SqlCommand(); sqlcommand.Connection = SQLDBConnection.con; sqlcommand.CommandText ="Insert into dbo.tblData(NTLogin, SystemName, LockTime, LoginTime, LastDefenitionDate) values ('" + data.NTLogin +"','" + data.SystemName +"','" + data.LockTime +"' , '" + data.LoginTime +"', '" + data.LastDefenitionDate +"')"; sqlcommand.CommandType = CommandType.Text; int RowsAffected = sqlcommand.ExecuteNonQuery(); } #endregion } |
`
编辑:
可能重复的建议的答案对我来说不成立。这里给出了我的全部代码。在发表我的问题之前,我甚至看过那篇文章。请检查我的密码。
阅读以下文章,它详细介绍了如何使用GetObject从VBA代码调用WCF服务:
使用WCF服务名字对象从Excel VBA客户端调用WCF服务网址:http://damianblog.com/2009/07/05/excel-wcf/
但它只适用于简单的WCF服务合同。对于更复杂的事情,您需要使用vsto
upd:在这种情况下,当将名字对象与mex协定一起使用时,应该只使用基元类型和基元类型数组。当您需要使用复杂类型时,可以尝试将它们打包成字符串,或者使用更高级的技术,如带COM客户端的wcf名字对象(http://msdn.microsoft.com/en-us/library/ms752245.aspx)或vsto。