【问题标题】:VBA Excel ADO sp_addextendedproperty stored procedure executionVBA Excel ADO sp_addextendedproperty 存储过程执行
【发布时间】:2015-06-24 12:54:28
【问题描述】:

我正在尝试在 Excel 中创建一个用户表单,它允许用户将新列和描述添加到现有 SQL 服务器表中。

我在 VBA 中使用 ADO 库。要向创建的列添加描述,我需要运行系统存储过程 sp_addextendedproperty。

我无法传递参数给它,我总是收到错误 错误 -2147217900:为过程“sp_addextendedproperty”指定了无效的参数或选项。

Private Sub InsertField_bt_Click()
    Set con = New ADODB.Connection
    con.Provider = "sqloledb"
    sConnectionString = "Server=rumossql12;Database=PharmNet;UID=(login here);Pwd=(password here)"
    con.Open sConnectionString

    Set cmd = New ADODB.Command
    cmd.CommandType = adCmdStoredProc
    cmd.ActiveConnection = con
    cmd.CommandText = "sp_addextendedproperty"

    Dim name As ADODB.Parameter
    Dim value As ADODB.Parameter
    Dim level0type As ADODB.Parameter
    Dim level0name As ADODB.Parameter
    Dim level1type As ADODB.Parameter
    Dim level1name As ADODB.Parameter
    Dim level2type As ADODB.Parameter
    Dim level2name As ADODB.Parameter

    Set name = cmd.CreateParameter("@name", adVarWChar, adParamInput, 128, "N'MS_Description'")
    cmd.Parameters.Append name

    Set value = cmd.CreateParameter("@value", adVariant, adParamInput, , "N'" & InsertField.TextBox2.value & "'")
    cmd.Parameters.Append value

    Set level0type = cmd.CreateParameter("@level0type", adVarChar, adParamInput, 128, "N'SCHEMA'")
    cmd.Parameters.Append level0type

    Set level0name = cmd.CreateParameter("@level0name", adVarWChar, adParamInput, 128, "N'dbo'")
    cmd.Parameters.Append level0name

    Set level1type = cmd.CreateParameter("@level1type", adVarChar, adParamInput, 128, "N'TABLE'")
    cmd.Parameters.Append level1type

    Set level1name = cmd.CreateParameter("@level1name", adVarWChar, adParamInput, 128, "N'tbConsolidator'")
    cmd.Parameters.Append level1name

    Set level2type = cmd.CreateParameter("@level2type", adVarChar, adParamInput, 128, "N'COLUMN'")
    cmd.Parameters.Append level2type

    Set level2name = cmd.CreateParameter("@level2name", adVarWChar, adParamInput, 128, "N'" & InsertField.TextBox1.value & "'")
    cmd.Parameters.Append level2name

    On Error GoTo ErrHandler


    sSQL = "ALTER TABLE PharmNet.dbo.tbConsolidator ADD " & InsertField.TextBox1.value & " NVARCHAR(255) NULL"
    'con.Execute sSQL
    cmd.Execute
    InsertField.Hide

ErrHandler:
    MsgBox "Error " & Err.Number & ": " & Err.Description, vbCritical, "ErrorThingy"
    Sheet2.Cells(1, 1).value = "Error " & Err.Number & ": " & Err.Description
    con.Close
    Set con = Nothing
End Sub

为什么会发生? 预先感谢您的帮助! :)

【问题讨论】:

  • 快速 - 似乎 adVarWChar/adVarChar 有问题。我不知道你为什么要对所有参数使用 Unicode,但如果你这样做 - 保持一致。
  • @Juliusz addextendedproperty 的规范要求使用“sysname”类型的 levelxtype,它基本上是 nvarchar(128) 和 levelxname,它是 varchar。因此混合参数类型。

标签: sql-server vba excel stored-procedures


【解决方案1】:

当我查看 MSDN 上 sp_addextendedproperty() 的示例代码时,我看到输入的 levelxtype 参数仅第一个字母大写:

USE AdventureWorks2012;
GO
EXEC sp_addextendedproperty 
@name = N'Caption', 
@value = 'Postal code is a required column.',
@level0type = N'Schema', @level0name = 'Person',
@level1type = N'Table',  @level1name = 'Address',
@level2type = N'Column', @level2name = 'PostalCode';
GO

例如here

也许你可以试试?

编辑

当我将您的代码放在示例旁边时,在我看来您正在颠倒名称和类型。试试这个:

Set name = cmd.CreateParameter("@name", adVarWChar, adParamInput, 128, "N'MS_Description'")
cmd.Parameters.Append name

Set value = cmd.CreateParameter("@value", adVariant, adParamInput, , "N'" & InsertField.TextBox2.value & "'")
cmd.Parameters.Append value

Set level0type = cmd.CreateParameter("@level0type", adVarWChar, adParamInput, 128, "N'Schema'")
cmd.Parameters.Append level0type

Set level0name = cmd.CreateParameter("@level0name", adVarChar, adParamInput, 128, "'dbo'")
cmd.Parameters.Append level0name

Set level1type = cmd.CreateParameter("@level1type", adVarWChar, adParamInput, 128, "N'Table'")
cmd.Parameters.Append level1type

Set level1name = cmd.CreateParameter("@level1name", adVarChar, adParamInput, 128, "'tbConsolidator'")
cmd.Parameters.Append level1name

Set level2type = cmd.CreateParameter("@level2type", adVarWChar, adParamInput, 128, "N'Column'")
cmd.Parameters.Append level2type

Set level2name = cmd.CreateParameter("@level2name", adVarChar, adParamInput, 128, "'" & InsertField.TextBox1.value & "'")
cmd.Parameters.Append level2name

【讨论】:

  • 我的 Schema 叫 dbo,table - tbConsolidator,列名必须由用户输入。我尝试将它们更改为 Dbo、TbConsolidator 并输入第一个大写字母的新列名,但它不起作用。
  • 啊,对不起。我是关于类型,而不是名称。 N'Schema'、N'Table'、N'Column 也不起作用。
  • @AlexeyNikolaev 可耻,我在您的代码中找不到任何其他/明显的内容。我发现的另一个建议是将cmd.CommandType = adCmdStoredProc 更改为cmd.CommandType = 4(4 是 adCmdStoredProc 的枚举值),但这是一个完全不同的错误消息...
  • @AlexeyNikolaev 另一件事:废弃 adVarChar 参数中的“N”。字符串前面的 N 使其成为 Unicode,您现在在非 Unicode 字段中输入 Unicode。这可能是你的冲突。
  • 还是谢谢你)使用 cmd.CommandType = 4 没有任何改变,我仍然收到同样的错误。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-10
  • 2019-06-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多