Saya mendapatkan kesalahan saat mengakses Prosedur Tersimpan di SQL Server
Server Error in '/' Application.
Procedure or function 'ColumnSeek' expects parameter '@template', which was not supplied.
Ini terjadi ketika saya memanggil Prosedur Tersimpan dengan parameter melalui koneksi data .net ke sql (System.data.SqlClient)
, meskipun saya menyediakan parameter. Ini kode saya.
SqlConnection sqlConn = new SqlConnection(connPath);
sqlConn.Open();
//METADATA RETRIEVAL
string sqlCommString = "QCApp.dbo.ColumnSeek";
SqlCommand metaDataComm = new SqlCommand(sqlCommString, sqlConn);
metaDataComm.CommandType = CommandType.StoredProcedure;
SqlParameter sp = metaDataComm.Parameters.Add("@template",SqlDbType.VarChar,50);
sp.Value = Template;
SqlDataReader metadr = metaDataComm.ExecuteReader();
Dan Prosedur Tersimpan saya adalah:
USE [QCApp]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[ColumnSeek]
@template varchar(50)
AS
EXEC('SELECT Column_Name, Data_Type
FROM [QCApp].[INFORMATION_SCHEMA].[COLUMNS]
WHERE TABLE_NAME = ' + @template);
Saya mencoba mencari tahu apa yang saya lakukan salah di sini.
Sunting: Ternyata, Template adalah null karena saya mendapatkan nilainya dari parameter yang melewati URL dan saya mengacaukan parameter url yang lewat (saya menggunakan @
for dan bukannya &
)
.net
sql-server
stored-procedures
Tony Peterson
sumber
sumber
QUOTENAME(@template)
Jawaban:
Saya akan memeriksa kode aplikasi saya dan melihat nilai apa yang Anda setel @template ke. Saya menduga itu nol dan di situlah letak masalahnya.
sumber
Selain jawaban lain di sini, jika Anda lupa menuliskan:
Kemudian Anda juga akan mendapatkan kesalahan ini.
sumber
Masalah ini memang biasanya disebabkan oleh pengaturan nilai parameter menjadi null seperti HLGEM yang disebutkan di atas. Saya pikir saya akan menguraikan beberapa solusi untuk masalah ini yang menurut saya berguna untuk kepentingan orang-orang yang baru mengenal masalah ini.
Solusi yang saya lebih suka adalah default parameter prosedur yang tersimpan ke NULL (atau nilai apa pun yang Anda inginkan), yang disebutkan oleh sangram di atas, tetapi mungkin terlewatkan karena jawabannya sangat bertele-tele. Sesuatu di sepanjang baris:
Ini berarti bahwa jika parameter akhirnya disetel dalam kode menjadi nol dalam beberapa kondisi, .NET tidak akan menyetel parameter dan prosedur tersimpan kemudian akan menggunakan nilai default yang telah ditentukan. Solusi lain, jika Anda benar-benar ingin menyelesaikan masalah dalam kode, akan menggunakan metode ekstensi yang menangani masalah tersebut untuk Anda, seperti:
Matt Hamilton memiliki posting bagus di sini yang mencantumkan beberapa metode penyuluhan yang lebih hebat saat menangani bidang ini.
sumber
Saya memiliki masalah di mana saya akan mendapatkan kesalahan ketika saya memberikan 0 ke param integer. Dan menemukan bahwa:
berfungsi, tetapi ini tidak:
sumber
Add
sintaks, atau Anda menggunakan penginisialisasi objek untuk perintah Anda, Anda dapat menggunakan parameter bernama:cmd.Parameters.Add(new SqlParameter("@Status", value: 0));
Untuk kasus saya, saya harus melewatkan
DBNULL.Value
(menggunakan kondisi jika lain) dari kode untuk parameter prosedur tersimpan yang tidak ditentukannull
tetapi nilainyanull
.sumber
Saya menemukan masalah serupa saat memanggil prosedur tersimpan
Yang secara dinamis membangun kueri untuk penelusuran yang saya panggil di atas satu dengan:
Kemudian setelah banyak garukan kepala saya mengubah prosedur tersimpan menjadi:
DI SINI Saya Menginisialisasi Parameter Input dari Prosedur Tersimpan ke null sebagai Berikut
itu melakukan trik untuk-Ku.
Saya harap ini akan membantu seseorang yang jatuh dalam perangkap serupa.
sumber
Jika Template tidak diset (yaitu == null), kesalahan ini akan dimunculkan juga.
Lebih banyak komentar:
Jika Anda mengetahui nilai parameter pada saat Anda menambahkan parameter, Anda juga dapat menggunakan AddWithValue
EXEC tidak diperlukan. Anda bisa mereferensikan parameter @template di SELECT secara langsung.
sumber
Pertama - mengapa itu EXEC? Bukankah seharusnya begitu
SP saat ini tidak masuk akal? Secara khusus, itu akan mencari kolom yang cocok dengan @template, bukan nilai varchar dari @template. yaitu jika @template adalah
'Column_Name'
, ia akan mencariWHERE TABLE_NAME = Column_Name
, yang sangat jarang (memiliki tabel dan kolom bernama sama).Selain itu, jika Anda memang harus menggunakan SQL dinamis, Anda harus menggunakan
EXEC sp_ExecuteSQL
(menjaga nilai sebagai parameter) untuk mencegah serangan injeksi (bukan penggabungan input). Tapi itu tidak perlu dalam kasus ini.Re masalah sebenarnya - sekilas terlihat OK; Anda yakin tidak memiliki salinan SP yang berbeda? Ini adalah kesalahan umum ...
sumber
Saya menemukan kesalahan ini hari ini ketika nilai nol diteruskan ke parameter prosedur tersimpan saya. Saya dapat dengan mudah memperbaiki dengan mengubah prosedur yang disimpan dengan menambahkan nilai default = null.
sumber
Saya memiliki masalah yang sama, untuk menyelesaikannya cukup tambahkan nama parameter yang persis sama ke koleksi parameter Anda seperti dalam prosedur tersimpan Anda.
Contoh
Katakanlah Anda membuat prosedur tersimpan:
Jadi pastikan untuk memberi nama parameter Anda persis seperti yang ada dalam prosedur tersimpan Anda
Jika kau pergi
kemudian terjadi kesalahan.
sumber
Perlu diketahui bahwa Stored Proc sedang dipanggil:
sumber