關鍵屬性設定
ClassInterfaceType.None:不產生類別介面,若未明確實作介面則僅支援 IDispatch 晚期繫結。建議明確實作介面供外部存取
ComSourceInterfaces(typeof(DBCOM_Events)):指定對外公開的事件介面。本範例不公開事件,介面定義為空
完整 COM 物件原始碼
using System;
using System.Runtime.InteropServices;
using System.IO;
using System.Text;
using System.Data.SqlClient;
using System.Windows.Forms;
namespace Database_COMObject
{
[Guid("694C1820-04B6-4988-928F-FD858B95C880")]
public interface DBCOM_Interface
{
[DispId(1)] void Init(string userid, string passWord);
[DispId(2)] bool ExecuteSelectCommand(string selCommand);
[DispId(3)] bool NextRow();
[DispId(4)] void ExecuteNonSelectCommand(string insCommand);
[DispId(5)] string GetColumnData(int pos);
}
[Guid("47C976E0-C208-4740-AC42-41212D3C34F0"),
InterfaceType(ComInterfaceType.InterfaceIsIDispatch)]
public interface DBCOM_Events { }
[Guid("9E5E5FB2-219D-4ee7-AB27-E4DBED8E123E"),
ClassInterface(ClassInterfaceType.None),
ComSourceInterfaces(typeof(DBCOM_Events))]
public class DBCOM_Class : DBCOM_Interface
{
private SqlConnection myConnection = null;
private SqlDataReader myReader = null;
public DBCOM_Class() { }
public void Init(string userid, string passWord)
{
try
{
string connStr = "user id=" + userid + ";password=" + passWord +
";Database=NorthWind;Server=SKYWALKER;Connect Timeout=30";
myConnection = new SqlConnection(connStr);
myConnection.Open();
MessageBox.Show("CONNECTED");
}
catch (Exception e) { MessageBox.Show(e.Message); }
}
public bool ExecuteSelectCommand(string selCommand)
{
if (myReader != null) myReader.Close();
SqlCommand cmd = new SqlCommand(selCommand, myConnection);
cmd.ExecuteNonQuery();
myReader = cmd.ExecuteReader();
return true;
}
public bool NextRow()
{
if (!myReader.Read()) { myReader.Close(); return false; }
return true;
}
public string GetColumnData(int pos)
{
object obj = myReader.GetValue(pos);
return obj == null ? "" : obj.ToString();
}
public void ExecuteNonSelectCommand(string insCommand)
{
SqlCommand cmd = new SqlCommand(insCommand, myConnection);
cmd.ExecuteNonQuery();
}
}
}