Python.NET - попытка выполнить хранимую процедуру в SQL Server
Все,
Я надеюсь, что кто-нибудь поможет мне запустить хранимую процедуру с помощью 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