2017-12-19 9 views
0

誤ったデータ型を入力したときに表示される除外例外を作成できるかどうか知りませんか?例では、明らかにそれは動作しませんが、それはあなたがTOPコマンドのPostgresの外側の例外をトリガすることはできませんC#postgresqlのデータ型を検証するためのRAISE EXCEPTIONの作成

string query = "INSERT INTO products(name_pr, quantity, price) VALUES('" + txtName.Text + "', '" + txtQuantity.Text + "','" + txtPrice.Text + "')"; 
con.Open(); 
comand = new NpgsqlCommand(query, con); 
+0

Em、データが 'smallint'でない場合、私はpostgresがそれに収まらないので、とにかく例外を受け取ると思いますか? – zaitsman

+0

C#側で検証するのはどうですか? Postgresに実際にコマンドを送信する前に、達成したいことができるかのように見えます。また、クエリをパラメータ化すると、たとえそれが実行されても防弾になります。 – Hambone

答えて

0

に挿入私は

CREATE TABLE products(
    name_pr varchar(20), 
    quantity smallint, 
    price smallint, 
    last_update timestamp, 
    latest_user_bd text 
); 
CREATE OR REPLACE FUNCTION validate_products() 
RETURNS TRIGGER AS 
$BODY$ 
BEGIN 

    IF NEW.price IS NOT SMALLINT THEN 
    RAISE EXCEPTION 'You must enter the Price'; 
    END IF; 

    NEW.last_update = now(); 
    NEW.latest_user_bd = user; 
    RETURN NEW; 
END; 
$BODY$ 
LANGUAGE plpgsql; 

CREATE TRIGGER validate_products 
BEFORE INSERT OR UPDATE 
ON products 
FOR EACH ROW EXECUTE PROCEDURE validate_products(); 

例を探しています何の例です。 PostgreSQL関数にパラメータを渡すことができます。そこでは、保護されたブロックでコマンドを実行できます。ここで例外を処理できます。いくつかのような

CREATE OR REPLACE FUNCTION new_product(__price text) 
RETURNS void AS $$ 
DECLARE _price smallint; 
BEGIN 
    _price := __price::smallint; 
    INSERT INTO product(..) (_price); 
EXCEPTION WHEN invalid_text_representation, numeric_value_out_of_range THEN 
    IF price IS NULL THEN 
    RAISE EXCEPTION 'the price is not valid smallint value %', _price; 
    END IF; 
END; 
$$ LANGUAGE plpgsql; 

私はこの "タイプのない"機能が好きではありませんが、あなたが望むものです。秒針PostgreSQLの種類に

は、バリアント型ではないので、パターン

IF some IS NOT smallint THEN -- has not sense 

はplpgsqlがナンセンスです。あなたは、正規表現を使用することができますnumericを使用して制限のテスト、またはsmallintにキャストし、例外をキャッチすることができます。

PLpgSQLは厳密な型付き言語(PostgreSQL SQLも)であるため、より動的でない型付き言語のパターンはそこでは使用できません。

通常、タイプとその値はUIレベルで最初にチェックする必要があります。また、セカンダリはSQLレベルで安全に適用する必要があります。 SQLレベルは再チェックしますが、共通の例外が発生する可能性があります。パラメータチェックは、プレゼンテーションレイヤーの方が優れています。

関連する問題