LoginSignup
Dodnt
@Dodnt

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

ASP.NETを用いたDB連携

ASP.NETを用いた会員情報登録ページのDB連結について

現在ASP.NETを用いてログイン機能の勉強をしています。
その際にデータの受け渡しをリテラルで行いSQLserverに登録するページを作っています。
パスワード、ログインID、氏名を登録したいのですがうまくいかなかった為、投稿させていただきました。

発生している問題・エラー

System.Data.SqlClient.SqlException: 'Incorrect syntax near the keyword 'Table'.'

こちらがエラーの画像となっております。
エラー画面.PNG

該当するソースコード

torokukakunin.aspx
using System;
using System.Configuration;
using System.Data.SqlClient;

public partial class torokukakunin : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        Literal1.Text = (String)Session["pass"];
        Literal2.Text = (String)Session["ID"];
        Literal3.Text = (String)Session["name"];
    }
    protected void Button1_Click(object sender, EventArgs e)
    {
        var connectionString = ConfigurationManager.ConnectionStrings["bbs"].ConnectionString; //[]ないを自分のDBネームにする

        using (var connection = new SqlConnection(connectionString))
        using (var command = connection.CreateCommand())
        {
            try
            {
                // データベースの接続開始
                connection.Open();

                // SQLの準備
                command.CommandText = @"INSERT INTO Table (pass, loginID, name) VALUES (@pass, @loginID, @name)";
                command.Parameters.Add(new SqlParameter("@pass", Literal1.Text));     //リテラル内を@パラメータに変換している。
                command.Parameters.Add(new SqlParameter("@loginID", Literal2.Text));
                command.Parameters.Add(new SqlParameter("@name", Literal3.Text));

                // SQLの実行
                command.ExecuteNonQuery();
            }
            catch (Exception exception)
            {
                Console.WriteLine(exception.Message);
                throw;
            }
            finally
            {
                // データベースの接続終了
                connection.Close();
            }
        }
    }
}

こちらの画面からデータを入力し、torokukakunin.aspxに遷移しDBに登録となっております。

kaintouroku.aspx
<%@ Page Title="" Language="C#" MasterPageFile="~/bbs.master" AutoEventWireup="true" CodeFile="kaintouroku.aspx.cs" Inherits="kaintouroku" %>

<asp:Content ID="Content1" ContentPlaceHolderID="head" Runat="Server">
</asp:Content>
<asp:Content ID="Content2" ContentPlaceHolderID="ContentPlaceHolder1" Runat="Server">
    <asp:Label ID="Label1" runat="server" Text="パスワード"></asp:Label>
    <br/>
    <asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>
    <br />
    <asp:Label ID="Label2" runat="server" Text="ログインID"></asp:Label>
    <br />
    <asp:TextBox ID="TextBox2" runat="server"></asp:TextBox>
    <br />
    <asp:Label ID="Label3" runat="server" Text="氏名"></asp:Label>
    <br />
    <asp:TextBox ID="TextBox3" runat="server"></asp:TextBox>
    <br />
    <asp:Button ID="Button1" runat="server" Text="登録" OnClick="Button1_Click" />
</asp:Content>

ssmsというものを使いDBとの接続を行っています。
コントロールパネルでもSQLserver(express)は起動となっております。
変数の確認、IDの確認など。

宜しくお願いします。

0

2Answer

SQLServer で TABLE は予約語になっています。
文法上、予約語もテーブル名やカラム名に使えますが、特別にクォーテーションでくくるなどしないといけません。

そのため、クォーテーションでくくっていない Table はテーブル名として使えません。

SQL Server の予約済みキーワードを識別子およびオブジェクト名として使用することは構文的に可能ですが、これは識別子を区切って使用するときに限られます。

対策は大きく2種類あります。

  • テーブル名を Table から別の名前に変更する
  • テーブル名 Table をクォーテーションでくくる

おすすめは、テーブル名を変更することです(今後、同じ問題が何度も起きて、手間がかかるので)

もし、どうしても Table から変えたくない場合には、ダブルクォーテーション "" でくくるか、ブラケット [] でくくるようにしてください。ダブルクォーテーションの場合エスケープが必要になるので、ブラケットの方が簡単だと思います。

以下のようになると思います。

command.CommandText = @"INSERT INTO [Table] (pass, loginID, name) VALUES (@pass, @loginID, @name)";
1

現在[]を用いた際、しっかりと登録されていました!

原因や解決方法など細かく書いていただきありがとうございました。

0

Your answer might help someone💌