J'ai déjà essayé d'afficher des informations de base de données dans une zone de texte en utilisant ADO.NET et maintenant j'apprends à le faire en utilisant dapper
Voici mon code dapper:
try
{
using (var command = new SqlCommand("DisplayInfo", con))
using (IDbConnection db = new SqlConnection(ConfigurationManager.ConnectionStrings["SqlConnectionString"].ConnectionString))
{
SqlDataAdapter sda = new SqlDataAdapter(command);
if (db.State != ConnectionState.Open)
db.Open();
DynamicParameters param = new DynamicParameters();
param = new DynamicParameters("@Fname");
param.Add("@Fname", tb2.Text);
param = new DynamicParameters("@exist");
param.Add("@exist", SqlDbType.Bit);
con.Execute("DisplayInfo", param, commandType: CommandType.StoredProcedure);
DataTable dt = new DataTable();
sda.Fill(dt);
tb2.Text = dt.Rows[0]["Fname"].ToString();
tb3.Text = dt.Rows[0]["Lname"].ToString();
tb4.Text = dt.Rows[0]["Age"].ToString();
exist = Convert.ToBoolean(command.Parameters["@exist"].Value);
if (db.State != ConnectionState.Closed)
db.Close();
}
}
Et la procédure stockée DisplayInfo est juste une requête SELECT de base Qu'est-ce que je fais mal?
Code pour le SP:
@Fname nvarchar(50),
@exist bit output
AS
BEGIN
IF NOT EXISTS
(SELECT ID,Fname,Lname,Age FROM CloneInfo
WHERE Fname=@Fname)
BEGIN
SET @exist=0
END
ELSE
BEGIN
SELECT ID,Fname,Lname,Age FROM CloneInfo
WHERE Fname=@Fname
SET @exist=1
END
END
La table Plus CloneInfo a: ID, Fname, Lname, Age en colonnes
Et je reçois ces deux erreurs:
1-Procédure ou fonction 'DisplayInfo' attend le paramètre '@Fname' qui n'a pas été fourni.
2-Une valeur explicite pour la colonne d'identité de la table 'CloneInfo' ne peut être spécifiée que lorsqu'une liste de colonnes est utilisée et que IDENTITY_INSERT est activé.
Bien que ce n'est pas une bonne pratique pour insérer des valeurs d'identité, mais selon votre scénario. Vous pouvez essayer ceci.
Mettez d'abord la première ligne pour votre SP:
SET IDENTITY_INSERT CloneInfo ON
et la dernière ligne sera:
SET IDENTITY_INSERT CloneInfo OFF
Et passer les paramètres en tant que:
DynamicParameters param = new DynamicParameters();
param.Add("@Fname", tb2.Text);
param.Add("@exist", SqlDbType.Bit);
con.Execute("DisplayInfo", param, commandType: CommandType.StoredProcedure);
Il semble que vous deviez changer l'appel de 'con.Execute' à 'db.Query', veuillez voir l'exemple ci-dessous, je suppose que 'con' est de type SqlConnection.
class Program
{
static string connectionString = @"xxxxxxxxxx";
static void Main(string[] args)
{
Console.WriteLine("Input name: ");
var name = Console.ReadLine();
IEnumerable<TestClass> results;
using (IDbConnection db = new SqlConnection(connectionString))
{
var parameters = new DynamicParameters();
parameters.Add("@FName", name, DbType.String, ParameterDirection.Input, 20);
results = db.Query<TestClass>("Procedure",
commandType: CommandType.StoredProcedure,
param: parameters);
}
foreach(var result in results)
{
Console.WriteLine(result);
}
Console.ReadLine();
}
}
class TestClass
{
public string FName { get; set; }
public string LName { get; set; }
public int Age { get; set; }
public override string ToString()
{
return $"FName: {FName}, LName: {LName}, Age: {Age}";
}
}