0

全部,

我希望有人可以帮助我尝试使用 IronPython 和 CLR 运行存储过程。

我要做的就是让下面的存储过程运行。当它运行并到达 ExecuteNonQuery 行时,它会跳转到 SQLException 但我无法检索消息告诉我的内容。我显然做错了什么,但我无法弄清楚。

下面是来自 SQL Server 的存储过程(仅供参考 - 我没有更改过程;仅用于复制/粘贴目的):

/****** Object:  StoredProcedure [dbo].[spAddControlLimit]    Script Date: 4/5/2021 8:26:04 AM ******/
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO


ALTER PROCEDURE [dbo].[spAddControlLimit]
    -- Add the parameters for the stored procedure here
    @CLID nvarchar(max)
    ,@PLANTCODE nvarchar(4)
    ,@IC nvarchar(max)
    ,@PropertyDescription nvarchar(max)
    ,@PropertyCode nvarchar(max)
    ,@LN nvarchar(max)
    ,@SpecID nvarchar(max)
    ,@UCL numeric(11,4)
    ,@LCL numeric(11,4)
    ,@TargetMean numeric(11,4)
    ,@SetBy nvarchar(max)
    ,@SetDate datetime
    ,@Comments varchar(255)
AS
BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON;

    -- Insert statements for procedure here
    INSERT INTO [dbo].[SPC_CALCULATED_CONTROL_LIMITS]
               ([ControlLimitID]
               ,[PLANT_CODE]
               ,[ITEM_CODE]
               ,[PROPERTY_DESC]
               ,[PROPERTY_CODE]
               ,[LineNumber]
               ,[SpecID]
               ,[UpperControlLimit]
               ,[LowerControlLimit]
               ,[TargetMean]
               ,[SetBy]
               ,[SetDate]
               ,[Comments])
         VALUES
               (@CLID
               ,@PLANTCODE
               ,@IC
               ,@PropertyDescription
               ,@PropertyCode
               ,@LN
               ,@SpecID
               ,@UCL
               ,@LCL
               ,@TargetMean
               ,@SetBy
               ,@SetDate
               ,@Comments)
END
GO

这是应该执行该存储过程的 IronPython 代码:

import clr

clr.AddReference("System.Windows.Forms")
clr.AddReference("System.Drawing")
clr.AddReference("System.Data")
clr.AddReference("System.Globalization")
clr.AddReference('System.Collections')
clr.AddReference('System')

from System import *
from System.Windows.Forms import *
from System.Drawing import *
from System.Data import *
from System.Data.SqlClient import *
from System.Globalization import *
from System.Collections.Generic import *

def btnSave_Click(self, sender, args):
            
            # Next, get the data from the highlighted row in the DataGridView
            for r in self.dgvCCL.SelectedRows: # https://docs.microsoft.com/en-us/dotnet/api/system.windows.forms.datagridview.selectedrows?view=net-5.0#System_Windows_Forms_DataGridView_SelectedRows
                data_list.append(r.Cells[1].Value.ToString())
                data_list.append(r.Cells[2].Value.ToString())
                data_list.append(r.Cells[3].Value.ToString())
                data_list.append(r.Cells[4].Value.ToString())
                data_list.append(r.Cells[5].Value.ToString())
                data_list.append(r.Cells[6].Value.ToString())
                data_list.append(r.Cells[7].Value.ToString())
                data_list.append(self.txtUCL.Text)
                data_list.append(self.txtLCL.Text)
                data_list.append(self.txtTarget.Text)
                data_list.append('YourEmployeeID')
                data_list.append(str(DateTime.Now))
                data_list.append(self.txtComment.Text)

            ExecQuery = "dbo.spAddControlLimit VALUES (@CLID,@PLANTCODE,@IC,@PropertyDescription,@PropertyCode,@LN,@SpecID,@UCL,@LCL,@TargetMean,@SetBy,@SetDate,@Comments)"
        
            self.UpdateData(ExecQuery, data_list)

    def UpdateData(self, Query, parameter_data):
        
        # https://stackoverflow.com/questions/1260952/how-to-execute-a-stored-procedure-within-c-sharp-program - Calling Store Procedure in C#
        try:
            connectionstring = 'YourConnectionString'
            
            sqlConn = SqlConnection(connectionstring)
            
            sqlConn.Open()
            
            # Create Command
            cmd = SqlCommand(Query, sqlConn)
            
            cmd.CommandType = CommandType.StoredProcedure
            
            cmd.Parameters.AddWithValue('@CLID', SqlDbType.NVarChar).Value = parameter_data[0]
            cmd.Parameters.AddWithValue('@PLANTCODE', SqlDbType.NVarChar).Value = parameter_data[1]
            cmd.Parameters.AddWithValue('@IC', SqlDbType.NVarChar).Value = parameter_data[2]
            cmd.Parameters.AddWithValue('@PropertyDescription', SqlDbType.NVarChar).Value = parameter_data[3]
            cmd.Parameters.AddWithValue('@PropertyCode', SqlDbType.NVarChar).Value = parameter_data[4]
            cmd.Parameters.AddWithValue('@LN', SqlDbType.NVarChar).Value = parameter_data[5]
            cmd.Parameters.AddWithValue('@SpecID', SqlDbType.NVarChar).Value = parameter_data[6]
            cmd.Parameters.AddWithValue('@UCL', SqlDbType.Decimal).Value = parameter_data[7]
            cmd.Parameters.AddWithValue('@LCL', SqlDbType.Decimal).Value = parameter_data[8]
            cmd.Parameters.AddWithValue('@TargetMean', SqlDbType.Decimal).Value = parameter_data[9]
            cmd.Parameters.AddWithValue('@SetBy', SqlDbType.NVarChar).Value = parameter_data[10]
            cmd.Parameters.AddWithValue('@SetDate', SqlDbType.DateTime).Value = parameter_data[11]
            cmd.Parameters.AddWithValue('@Comments', SqlDbType.NVarChar).Value = parameter_data[12]
            
            cmd.ExecuteNonQuery()
            
        except InvalidCastException:
            pass
            
        except SqlException:
            MessageBox.Show(SqlException.Message.ToString())
            
        except IOException:
            pass
            
        except InvalidOperationException:
            pass
        
        except ObjectDisposedException:
            pass

        except:
            MessageBox.Show("Something happened.")
        
        finally:
            if sqlConn.State == ConnectionState.Open:
                sqlConn.Close
4

0 回答 0