de-vraag
  • Pertanyaan
  • Tag
  • Pengguna
Notifikasi
Imbalan
Registrasi
Setelah Anda mendaftar, Anda akan diberitahu tentang balasan dan komentar untuk pertanyaan Anda.
Gabung
Jika Anda sudah memiliki akun, masuk untuk memeriksa pemberitahuan baru.
Akan ada hadiah untuk pertanyaan, jawaban, dan komentar tambahan.
Lebih
Sumber
Sunting
 user2920046
user2920046
Question

Prosedur atau fungsi tersimpan mengharapkan parameter yang tidak disediakan

Saya mencoba memasukkan data ke dalam database SQL Server dengan memanggil stored procedure, tetapi saya mendapatkan error

Prosedur atau fungsi 'SHOWuser' mengharapkan parameter '@userID', yang tidak disediakan.

Prosedur tersimpan saya disebut SHOWuser. Saya telah memeriksanya secara menyeluruh dan tidak ada parameter yang hilang.

Kode saya adalah:

public void SHOWuser(string userName, string password, string emailAddress, List<int> preferences)
{
        SqlConnection dbcon = new SqlConnection(conn);

        try
        { 
            SqlCommand cmd = new SqlCommand();

            cmd.Connection = dbcon;
            cmd.CommandType = System.Data.CommandType.StoredProcedure;
            cmd.CommandText = "SHOWuser";

            cmd.Parameters.AddWithValue("@userName", userName);
            cmd.Parameters.AddWithValue("@password", password);
            cmd.Parameters.AddWithValue("@emailAddress", emailAddress);

            dbcon.Open();

            int i = Convert.ToInt32(cmd.ExecuteScalar());

            cmd.Parameters.Clear();
            cmd.CommandText = "tbl_pref";

            foreach (int preference in preferences)
            {
                cmd.Parameters.Clear();
                cmd.Parameters.AddWithValue("@userID", Convert.ToInt32(i));
                cmd.Parameters.AddWithValue("@preferenceID", Convert.ToInt32(preference));

                cmd.ExecuteNonQuery();
            }
        }
        catch (Exception)
        {
            throw;
        }
        finally
        {
            dbcon.Close();
        }

dan prosedur yang tersimpan adalah:

ALTER PROCEDURE [dbo].[SHOWuser]
(
    @userName varchar(50),
    @password nvarchar(50),
    @emailAddress nvarchar(50)
)
AS
BEGIN
    INSERT INTO tbl_user(userName, password, emailAddress) 
    VALUES (@userName, @password, @emailAddress)

    SELECT
        tbl_user.userID, tbl_user.userName,
        tbl_user.password, tbl_user.emailAddress, 
        STUFF((SELECT ',' + preferenceName 
               FROM tbl_pref_master
               INNER JOIN tbl_preferences ON tbl_pref_master.preferenceID = tbl_preferences.preferenceID
               WHERE tbl_preferences.userID = tbl_user.userID
               FOR XML PATH ('')), 1, 1, ' ' ) AS Preferences
    FROM
        tbl_user

    SELECT SCOPE_IDENTITY();
END

Ini adalah prosedur tersimpan kedua tbl_pref yang digunakan dalam fungsi yang sama:

ALTER PROCEDURE [dbo].[tbl_pref]
    @userID int,
    @preferenceID int
AS
BEGIN
    INSERT INTO tbl_preferences(userID, preferenceID) 
    VALUES (@userID, @preferenceID)
END
34 2013-10-31T10:13:33+00:00 3
Luke Girvin
Luke Girvin
Pertanyaan edit 4 Juli 2017 в 11:32
Pemrograman
sql
sql-server
stored-procedures
Pertanyaan ini memiliki :value jawaban dalam bahasa Inggris, untuk membacanya masuk ke akun Anda.
Alex Krotnyi
Alex Krotnyi
18 September 2014 в 9:45
2014-09-18T09:45:35+00:00
Lebih
Sumber
Sunting
#22676035

Dalam kasus saya, saya menerima pengecualian ini bahkan ketika semua nilai parameter diberikan dengan benar tetapi jenis perintah tidak ditentukan:

cmd.CommandType = System.Data.CommandType.StoredProcedure;

Ini jelas bukan kasus dalam pertanyaan di atas, tetapi deskripsi pengecualian tidak terlalu jelas dalam kasus ini, jadi saya memutuskan untuk menentukannya.

Luke Girvin
Luke Girvin
Jawaban edit 4 Juli 2017 в 11:33
153
0
 ubercam
ubercam
2 April 2015 в 12:23
2015-04-02T12:23:50+00:00
Lebih
Sumber
Sunting
#22676036

Saya menemukan masalah ini kemarin, tetapi tidak ada solusi di sini yang bekerja dengan tepat, namun mereka mengarahkan saya ke arah yang benar.

Aplikasi kami adalah alat alur kerja yang ditulis dalam C # dan, terlalu disederhanakan, memiliki beberapa prosedur tersimpan pada database, serta tabel metadata tentang setiap parameter yang digunakan oleh setiap prosedur tersimpan (nama, urutan, tipe data, ukuran, dll), memungkinkan kami untuk membuat sebanyak mungkin prosedur tersimpan baru yang kami butuhkan tanpa harus mengubah C #.

Analisis masalah menunjukkan bahwa kode kami menetapkan semua parameter yang benar pada objek SqlCommand, namun setelah dieksekusi, kode itu melemparkan kesalahan yang sama seperti yang didapat OP.

Analisis lebih lanjut mengungkapkan bahwa beberapa parameter memiliki nilai null. Oleh karena itu, saya harus menarik kesimpulan bahwa objek SqlCommand mengabaikan objek SqlParameter apa pun dalam koleksi .Parameters mereka dengan nilai null.

Ada dua solusi untuk masalah ini yang saya temukan.

  1. Dalam prosedur tersimpan kita, berikan nilai default untuk setiap parameter, jadi dari @Parameter int ke @Parameter int = NULL (atau nilai default lainnya sesuai kebutuhan).

  2. Dalam kode kita yang menghasilkan objek SqlParameter individual, menetapkan DBNull.Value bukan null di mana nilai yang dimaksudkan adalah SQL NULL melakukan trik.

Pembuat kode asli telah pindah dan kode awalnya ditulis dengan Solusi 1 dalam pikiran, dan setelah menimbang manfaat dari keduanya, saya pikir saya akan tetap menggunakan Solusi 1. Jauh lebih mudah untuk menentukan nilai default untuk prosedur tersimpan tertentu saat menulisnya, daripada selalu menjadi NULL seperti yang didefinisikan dalam kode.

Semoga itu membantu seseorang.

36
0
Solution / Answer
 valex
valex
31 Oktober 2013 в 10:21
2013-10-31T10:21:46+00:00
Lebih
Sumber
Sunting
#22676034

Prosedur tersimpan Anda mengharapkan 5 parameter sebagai input

@userID int, 
@userName varchar(50), 
@password nvarchar(50), 
@emailAddress nvarchar(50), 
@preferenceName varchar(20) 

Jadi, Anda harus menambahkan semua 5 parameter ke panggilan SP ini:

    cmd.CommandText = "SHOWuser";
    cmd.Parameters.AddWithValue("@userID",userID);
    cmd.Parameters.AddWithValue("@userName", userName);
    cmd.Parameters.AddWithValue("@password", password);
    cmd.Parameters.AddWithValue("@emailAddress", emailAddress);
    cmd.Parameters.AddWithValue("@preferenceName", preferences);
    dbcon.Open();

PS: Tidak jelas untuk apa parameter ini. Anda tidak menggunakan parameter-parameter ini di badan SP Anda sehingga SP Anda akan terlihat seperti:

ALTER PROCEDURE [dbo].[SHOWuser] AS BEGIN ..... END
Jeff Reddy
Jeff Reddy
Jawaban edit 25 Mei 2017 в 11:46
11
0
Tambahkan pertanyaan
Kategori
Semua
Teknologi
Budaya / Rekreasi
Kehidupan / Seni
Ilmu Pengetahuan
Profesional
Bisnis
Pengguna
Semua
Baru
Populer
1
UbiBot UK
Terdaftar 15 jam yang lalu
2
Галина Утяшова
Terdaftar 1 hari yang lalu
3
Asilbek Qadamboyev
Terdaftar 4 hari yang lalu
4
Akshit Mehta
Terdaftar 1 minggu yang lalu
5
me you
Terdaftar 1 minggu yang lalu
ID
JA
KO
RU
© de-vraag 2022
Sumber
stackoverflow.com
di bawah lisensi cc by-sa 3.0 dengan atribusi