关于Web服务:使用GetObject()方法从Excel VBA调用WCF Web服务

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服务。我们怎么做?我已经尝试过GetObject()方法,但是在使用这个方法时出现语法错误。我想在Excel中显示从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。