J'ai une base de données structurée comme suit:
utilisateurs
userid (Primary Key)
username
groupe
groupid (PK)
groupName
Groupes d'utilisateurs
userid (Foreign Key)
groupid (Foreign Key)
La première fois qu'un utilisateur se connecte, j'aimerais que ses informations soient ajoutées à la table des utilisateurs. Donc, essentiellement, la logique que je voudrais avoir si
if (//users table does not contain username)
{
INSERT INTO users VALUES (username);
}
Comment puis-je faire cela intelligemment en utilisant SQL Server/C #?
Ou en utilisant la nouvelle syntaxe MERGE:
merge into users u
using (
select 'username' as uname
) t on t.uname = u.username
when not matched then
insert (username) values (t.uname);
En gros, vous pouvez le faire comme ceci:
IF NOT EXISTS (SELECT * FROM USER WHERE username = @username)
INSERT INTO users (username) VALUES (@username)
Mais sérieusement, comment allez-vous savoir si un utilisateur a visité votre site Web pour la première fois? Vous devez insérer des enregistrements dans l'utilisateur de la table, lorsque quelqu'un s'inscrit sur votre site Web, pas vous connecter.
IF NOT EXISTS (select * from users where username = 'username')
BEGIN
INSERT INTO ...
END
Je voudrais d'abord créer un proc stocké sur la base de données pour faire la vérification et insérer si nécessaire:
CREATE PROCEDURE AddNewUserProc
(
@username VarChar(50) -- replace with your datatype/size
)
AS
IF NOT EXISTS (SELECT * FROM users WHERE username = @username)
BEGIN
INSERT INTO users
VALUES (@username)
END
Ensuite, une méthode sur l'application qui appellera cette procédure
public void AddNewUserMethod(string userName)
{
SqlConnection connection = new SqlConnection("connection string");
SqlCommand command = new SqlCommand("AddNewUserProc", connection);
command.CommandType = CommandType.StoredProcedure;
command.Parameters.Add("username", SqlDbType.VarChar, 50).Value = userName;
try
{
connection.Open();
command.ExecuteNonQuery();
}
finally
{
if (connection.State == ConnectionState.Open) { connection.Close(); }
}
}
@gbn answer nécessite SQL Server 2008 ou supérieur. J'ai essayé une méthode non-fusion pour le faire. Moche peut-être, mais ça marche.
declare @user varchar(50)
set @user = 'username'
insert into users (username)
select @user
where not exists (
select username
from users
where username = @user
);
Si vous souhaitez tester l'une des réponses, voici le code SQL de la table -
CREATE TABLE [dbo].[users](
[userid] [int] NULL,
[username] [varchar](50) NULL
)
INSERT [dbo].[users] ([userid], [username]) VALUES (1, N'John')
INSERT [dbo].[users] ([userid], [username]) VALUES (2, N'David')
INSERT [dbo].[users] ([userid], [username]) VALUES (3, N'Stacy')
INSERT [dbo].[users] ([userid], [username]) VALUES (4, N'Arnold')
INSERT [dbo].[users] ([userid], [username]) VALUES (5, N'Karen')
Le code suivant est une méthode qui renvoie 0 si l'utilisateur existe déjà et renvoie le nouvel utilisateurIDqui vient d'être ajouté:
private int TryToAddUser(string UserName)
{
int res = 0;
try
{
string sQuery = " IF NOT EXISTS (select * from users where username = @username) \n\r" +
" BEGIN \n\r" +
" INSERT INTO users values (@username) \n\r" +
" SELECT SCOPE_IDENTITY() \n\r " +
" END \n\r " +
" ELSE SELECT 0";
using (System.Data.SqlClient.SqlCommand cmd = new System.Data.SqlClient.SqlCommand())
{
cmd.CommandText = sQuery;
cmd.Parameters.AddWithValue("@username",UserName);
cmd.Connection = new System.Data.SqlClient.SqlConnection("SomeSqlConnString");
cmd.Connection.Open();
res = (int)cmd.ExecuteScalar();
cmd.Connection.Close();
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
return res;
}
Il y a une solution simple! Je l'ai trouvé dans ce post !
INSERT INTO users (Username)
SELECT ('username')
WHERE NOT EXISTS(SELECT * FROM users WHERE Username= 'username')
Dans mon projet, je devais le faire avec 2 valeurs. Donc mon code était:
INSERT INTO MyTable (ColName1, ColName2)
SELECT 'Value1','Value2'
WHERE NOT EXISTS
(SELECT * FROM MyTable WHERE ColName1 = 'Value1' AND ColName2= 'Value2')
J'espère que cela t'aides!
Voici un exemple (probablement trop simplifié) qui aborde votre problème. Notez qu'il est toujours préférable d'utiliser des paramètres pour empêcher les attaques par injection, en particulier lors de la vérification des utilisateurs.
CREATE PROCEDURE AddUser
@username varchar(20)
AS
IF NOT EXISTS(SELECT username FROM users WHERE username=@username)
INSERT INTO users(username) VALUES (@username)