2010-08-30 17 views
0

J'écris une procédure stockée pour mettre à jour une table:MySql, .NET, procédures stockées partageant la date et l'heure avec le client appelant

UPDATE st SET somedate = NOW(); 

Le client du SP doit connaître l'exacte date et heure générées par la fonction NOW.

Il y a deux options:

1) le client passe un paramètre d'entrée (appelé _now) à la SP lui donnant la date et l'heure

UPDATE st SET somedate = _now; 

2) le retourne SP retour l'est MAINTENANT sortie au client dans un paramètre sur

UPDATE st SET somedate = NOW(); 
SELECT somedate FROM st INTO _now; 

Que pensez-vous est la meilleure option? D'autres options sont-elles possibles?

Répondre

1
  • varnow = maintenant()
  • MISE A JOUR st = somedate mis varnow
  • retour varnow
+0

c'est la deuxième option. pourquoi est-ce mieux que le premier? – vulkanino

+0

@vulkanino, car il n'utilise maintenant() que dans un seul endroit. –

+0

car dans votre méthode vous faites 2 opérations db une mise à jour et un select alors que michael ne fait qu'une mise à jour - simples. –

-1

Je pense que les deux approches sont erronées.

client du SP doit connaître la date et l'heure exacte

Pourquoi? Je soupçonne que vous êtes vraiment des hommes que le client doit être capable d'identifier les documents touchés par une transaction - mais l'utilisation d'un horodatage pour le faire ne sera pas exacte. Et ce n'est pas seulement une transaction couvrant plus de 1 seconde qui est le problème. Deux opérations de ce type peuvent potentiellement se produire dans la même seconde.

Si vous avez un ensemble d'enregistrements que vous devez identifier comme appartenant à un groupe, cela doit être exprimé dans le schéma - l'horodatage de la plupart des transactions n'est évidemment pas fiable même si vous n'avez jamais d'autres mises à jour sur la table. Ajoutez une autre colonne ou un autre tableau et générez une clé de substitution pour décrire la transaction.

C.

+0

Je veux informer le client s'il a des données précises (mises à jour) mais ne regarde pas toutes les tables de mon modèle. Donc, je compare le champ last_updated dans un tableau simple avec le variabile LastUpdated dans mon application client, si elles diffèrent, je dois recharger beaucoup de tables, mais si elles ne le font pas, je vais bien. – vulkanino

+0

Cela ne fonctionne que si la vérification est effectuée entre chaque opération de mise à jour - pouvez-vous garantir cela? OTOH si vous utilisiez un identificateur de transaction incrémenté, il serait facile de détecter si les données n'ont pas été synchronisées et quelles sont les données manquantes. C'est ainsi que fonctionne TCP (et tous les autres protocoles de réseau liés au flux). Je ne pense pas que vous avez inventé une meilleure solution. – symcbean

0

je ferais quelque chose comme ceci:

drop table if exists users; 
create table users 
(
user_id int unsigned not null auto_increment primary key, 
username varchar(32) unique not null, 
created_date datetime not null 
) 
engine=innodb; 


delimiter ; 

drop procedure if exists insert_user; 

delimiter # 

create procedure insert_user 
(
in uname varchar(32) 
) 
proc_main:begin 

declare id int unsigned default null; 
declare created datetime default null; 

set created = now(); 

insert into users (username, created_date) values (uname, created); 

set id = last_insert_id(); 

-- use id elsewhere maybe... 

select id as user_id, created as created_date; 

end proc_main # 


delimiter ; 

call insert_user('f00'); 
call insert_user('bar'); 

select * from users;