调用函数“OpenDataSource”时出错

时间:2013-10-31 16:37:44

标签: c# sql-server-2008 ms-word dsn mailmerge

我想创建一个MS Word合并文档。我已经创建了一个模板文档。当我的应用程序启动时,它会创建一个名为“Hrms2008”的ODBC。我不熟悉这种东西,这就是为什么我不知道导致错误的原因。

  word.Application wrdApp;
                word.Document wrdDoc;

                object oMissing = System.Reflection.Missing.Value;
                object oName = "DSN=Hrms2008;DATABASE=Pitshrms4002;Integrated Security = True;";
                object oSQL = "Select * from tiblMerge";
                object oTemplate = briefNieuw.Brief;

                wrdApp = new word.Application();
                wrdApp.Visible = true;

                wrdDoc = wrdApp.Documents.Add(ref oTemplate,ref oMissing,ref oMissing,ref oMissing);

                wrdDoc.MailMerge.MainDocumentType = word.WdMailMergeMainDocType.wdFormLetters;
                wrdDoc.MailMerge.OpenDataSource("", oName, oSQL);

我得到的错误:“类型不匹配。来自HRESULT的异常:0X80020005(DISP_ETYPEMISMATCH)”

我在这里做错了什么?

1 个答案:

答案 0 :(得分:1)

OpenDataSource需要更多参数,即Connection字符串是第12个参数,而SQL Statement参数是第13个参数。由于所有参数都在C#中定义为“对象”,并且最近有足够的C#,编译器应该接受3个参数,但是在运行时COM期望第2个参数是Format,依此类推。因此,您需要做的第一件事是使用命名参数(如果您的C#版本支持该参数)或提供缺少的参数并在正确的位置获取连接和sqlstatement参数。

除此之外,如果连接字符串和SQL语句在Word之外正常工作,您几乎肯定会遇到Word中的其他问题,例如。

对于ODBC连接,肯定是名称设置为“”的连接,Word通常希望您将Subtype参数的值设置为wdMergeSubtypeWord2000(请检查该名称!)。

即使您拥有的SQL没有任何问题,但在某些情况下,如果您没有“引用”表名,则会出现Word对象,例如:使用Select * from“tiblMerge”

通过OpenDataSource使用ODBC驱动程序时,任何具有Unicode字符串数据类型(NVARCHAR,NCHAR等)的列都将返回空白/ null。

由于Unicode的问题,作为Word的一般规则,目前最好尝试使用OLE DB提供程序,尽管微软已宣布ODBC将成为其未来的SQL Server连接标准。要使用OLE DB,Name参数必须是带有所有相关连接信息的合适的.odc文件,或者它可以指定一个空的.odc文件,您可以提供连接信息。在Connection参数中。