实现sqlclr函数时,我在sql server 2012上收到错误?

已加入
2018年9月26日
留言内容
22
编程经验
3-5
问题
当实现clr功能时,我在SQL Server 2012 Windows 7上工作时出现错误

消息6522,第16级,状态1,第1行
用户定义的例程或聚合的执行过程中发生了.NET Framework错误"spExecuteParallel":
System.NullReferenceException:对象引用未设置为对象的实例。
System.NullReferenceException:
在SqlStoredProcedureClr.spExecuteParallel(String DB,Int32 MaxDOP,String TSQL,Int32 msDelay,Int32重试)
.

实际上仅对插入和插入数据执行一次,但是在显示上方出现该错误之后
选择dbo.spExecuteParallel
(N'Test',8,N'Insert到TestTable(messagesData,LogDateValues)值(``Test'',GetDate())',0,1)


函数SQL 清除率是

创建函数[dbo]。[spExecuteParallel](@ DB [nvarchar](200),@ MaxDOP [int],@ TSQL [nvarchar](4000),@ msDelay [int],@ Retries [int])
使用执行者调用程序返回[bigint],在NULL输入上返回NULL

外部名称[StoredProcedures]。[SqlStoredProcedureClr]。[spExecuteParallel]


我试过的


公共静态类SqlStoredProcedureClr
{

[SqlFunction(SystemDataAccess = SystemDataAccessKind.Read,DataAccess = DataAccessKind.Read)]
公共静态SqlInt64 spExecuteParallel(字符串DB,int MaxDOP,字符串TSQL,int msDelay,int Retries)
{
//初始化变量
SqlConnection oConn =新的SqlConnection();
SqlCommand oCmd =新的SqlCommand();
清单<string> oErrorString = new 清单<string>();
对象oLocker = new object();
串 sServer = null;

清单<Thread> oThread = new 清单<Thread>();
StringCollection sStopped = new StringCollection();



oConn =新的SqlConnection("上下文连接= true;");
oConn.Open();

oCmd = oConn.CreateCommand();
oCmd.CommandText ="SELECT @@SERVERNAME";
sServer = oCmd.ExecuteScalar()。ToString();

oCmd.Dispose();
oConn.Close();
oConn.Dispose();

// Execute 线s
int iCurrentThread = 0;
而(iCurrentThread< MaxDOP)
{
执行SQLExecuter = new ExecuteSQL
(sServer,DB,TSQL.Replace("?",DB.ToString()。Trim()),重试,ref oErrorString,ref oLocker);

线 oItem = new 线(Executer.Process);
oItem.Name ="ExecuteSQL "+ DB.ToString()。Trim();
oItem.Start();
oThread.Add(oItem);

SqlContext.Pipe.Send(DateTime.Now.ToLongTimeString()+
" : Start : "+ oItem.Name.Replace("ExecuteSQL ", ""));
线.Sleep(msDelay);

while(RunningThreads(ref oThread,ref sStopped)>= MaxDOP)
{
线.Sleep(1000);
}
iCurrentThread ++;
}

// Wait for all 线s to Stop
while(RunningThreads(ref oThread,ref sStopped)> 0)
{
线.Sleep(1000);
}
SqlContext.Pipe.Send("All 线 have Stopped with " +
oErrorString.Count.ToString()+" Error/s ");

如果(oErrorString.Count> 0)
{
尝试
{
foreach(oErrorString中的字符串sIndividualErrors)
{
SqlContext.Pipe.Send(sIndividualErrors.ToString());
}
}
抓住(前例外)
{
ex.ToString();

}

抛出新的异常("Error Occurred.");
}

返回0-oErrorString.Count;
}

public static int RunningThreads(参考列表<Thread>oThread,参考StringCollection oStops)
{
int iRunningCount = 0;

foreach(oThread中的线程oIndividualThread)
{
如果(oIndividualThread.IsAlive)
{
iRunningCount + = 1;
}
否则如果(!oStops.Contains(oIndividualThread.Name))
{
oStops.Add(oIndividualThread.Name);
SqlContext.Pipe.Send(DateTime.Now.ToLongTimeString()+" : Stop : "+ oIndividualThread.Name.Replace("ExecuteSQL ", ""));


}
}
返回iRunningCount;
}
}
ExecuteSQL类
{

private 清单<string> oExecuteErrors;
私有对象oExecuteLocker;
private 串 sExecuteServer;
private 串 sExecuteDB;
private 串 sExecuteTSQL;
私人int iExecuteRetries;

公开ExecuteSQL(字符串sServer,字符串sDB,字符串sTSQL,
int iRetries,参考列表<string>o错误,参考对象oLocker)
{
this.sExecuteServer = sServer;
this.sExecuteDB = sDB;
this.sExecuteTSQL = sTSQL;
this.iExecuteRetries = iRetries;
this.oExecuteErrors = oErrors;
this.oExecuteLocker = oLocker;
}

公共无效Process()
{
int iTries = 1;
SqlConnection oConn =新的SqlConnection();

重试:
oConn =新的SqlConnection("Data Source=" + sExecuteServer +
";Initial Catalog=" + sExecuteDB + ";集成安全性= SSPI;");
尝试
{
oConn.Open();

如果(oConn.State == ConnectionState.Open)
{
SqlCommand oCmd = oConn.CreateCommand();
oCmd.CommandText =sExecuteTSQL;
oCmd.CommandTimeout = 0;
oCmd.ExecuteNonQuery();

oCmd.Dispose();
oConn.Close();
oConn.Dispose();
}
其他
{
抛出新的异常("找不到SQL Server或无法连接到SQL Server");
}
}
抓住(前例外)
{
如果(oConn.State!= ConnectionState.Closed)oConn.Close();
oConn.Dispose();

如果(iTries<= iExecuteRetries)
{
线.Sleep(5000);
iTries + = 1;
转到重试
}
其他
{
锁(oExecuteLocker)
{
char cSpace = char.Parse(" ");
oExecuteErrors.Add(this.sExecuteDB.PadRight(16,cSpace)+" : " + ex.Message);
}
}
}
}
 
Last edited:

羊皮

退休程序员
工作人员
已加入
2018年9月5日
留言内容
1,925
地点
英国
编程经验
10+
我们已经解决了这个问题。您什么时候开始在代码标签中发布代码。您没有采取适当的措施来适当地发布您的问题,从而剥夺了自己的帮助。
人们拒绝帮助您的原因可能有很多。
  • 您将简要介绍您的解释,而不必提出要求 直接 问题即。 -为什么在第15行等处出现formatException错误
  • 您没有投入足够的精力来解释当前代码的问题,或者您对要执行的操作不够详细
  • 您没有解释为什么您的代码对您不起作用
  • 您不解释是否收到任何错误,如果存在,则不列出错误,也没有陈述您是否收到任何错误,
  • 您在多个论坛上发帖,并在这里为自己发言,像我这样的人每隔几个小时就会阅读其他论坛。在所有论坛上发布相同的问题会设置错误的语气。这也使您看起来像一个无贡献的人 帮助吸血鬼
  • 您不会将代码发布在代码标签中,尽管您可以设法在大多数其他论坛上正确地执行此操作。尽管我之前告诉过您使用代码标签,但您未能在此网站上纠正您的习惯。
结合以上所述,您只能怪自己。给您的主题一个适当的结构,并花时间用英语正确地写出来。尽管我们确实知道英语并不是每个人的母语,但是当您可以利用今天或许多在线语言翻译时,您没有任何措辞不佳的借口。现在,您已经阅读了所有内容,希望您下次记问题时还记得。
请注意,Sheepings上面的所有要点都包含在 如何聪明地提问。当您询问交叉发布的粗鲁做法时,当我在另一个论坛中回复时,我给了您指向同一页面的链接。花10到15分钟阅读该页面上有关如何组合好问题的建议。
对不起,我认识到这一点,我会解决的
我相信你,当我看到它...

至于您的错误,它非常清晰准确,任何快速的google或bing搜索都会告诉您原因。此外,请查看错误出现的位置,然后使用调试器并确定值为何为null的原因。
 

金西尼

C#论坛主持人
工作人员
已加入
2011年4月23日
留言内容
3,501
地点
悉尼,澳大利亚
编程经验
10+
我将不再为您格式化代码。您需要编辑帖子并正确设置代码格式。它花费了几秒钟,所以完全没有时间花时间,然后期望我们花费更多的时间来阅读代码并弄清相关内容,这是完全懒惰的。您在这里的人愿意甚至渴望志愿服务于帮助陌生人的时间。我们希望得到您的回报,即可以帮助我们为您提供帮助。如果您不准备这样做,就不会获得想要的帮助。我们不是在这里被利用。
 
最佳 底部