私は学生で、プログラミングはまったくの初心者です。ASP.NET と C# を使用するタスクを与えられましたが、どちらも教わることはありませんでした。計画は、自分自身を教えることを学ぶことです。
私が立ち往生しているタスクは、CSV または XLS ファイルからキャンパス周辺の昨年の部屋予約の SQL データベースに Web サイトをインポートすることです。
チュートリアルに従っていくつかのことを学びましたが、csv ファイル (エントリを区切るために使用される区切り文字はコンマ ",") と xls ファイルをテーブルに "読み取る" ように c# をプログラムする方法を見つけることに行き詰まっています。 Microsoft の SQL データベースを使用します。
そこで、Visual Studio をダウンロードし、asp.net の Web フォームを使い始めた後、.aspx フォームにボタンを作成して、クリックするとインポートをトリガーすることから始めました。
<asp:Button ID="Button1" runat="server" Text="Button" OnClick="Import_button_Click"/>
関数に「Import_Button_Click」という名前を付けます
ここでは、チュートリアルで Filehelpers という .dll ライブラリを見つけました。有望そうに見えたので、やってみました。Visual Studio で参照を追加し、「Filehelpers を使用する」も追加しました。C# フォームの先頭。
ここにリンクがあります: http://filehelpers.sourceforge.net/
だから、私は使用します:
FileHelperEngine engine = new FileHelperEngine(typeof(CSVfile));
と
CSVfile[] result = engine.ReadFile("C:\\CSVDATA\\previousyear.csv") as CSVfile[];
CSVファイルを読み込めるようにします。一方、CSV ファイルのすべてのエントリを変数として格納するクラスを作成します。
[DelimitedRecord(",")]
public class CSVfile //CSVfile class being defined
{
public int Request_ID;
public int Priority;
public int Module_ID;
public string Day;
public string Start_Time;
public int Length;
public string Park;
public int Students;
public string Room_Code;
public string Status;
public int Semester_ID;
public int Linked_Request;
public int Week_1;
public int Week_2;
public int Week_3;
public int Week_4;
public int Week_5;
public int Week_6;
public int Week_7;
public int Week_8;
public int Week_9;
public int Week_10;
public int Week_11;
public int Week_12;
public int Week_13;
public int Week_14;
public int Week_15;
}
その後、previousyear.csv を読み取る場所のすぐ下で、すべてのエントリを取得して正しい変数に配置するループを実行します。
DataTable table = new DataTable();
table.Columns.Add(" ", typeof(int));
table.Columns.Add(" ", typeof(int));
table.Columns.Add(" ", typeof(int));
table.Columns.Add(" ", typeof(string));
table.Columns.Add(" ", typeof(string));
table.Columns.Add(" ", typeof(int));
table.Columns.Add(" ", typeof(string));
table.Columns.Add(" ", typeof(int));
table.Columns.Add(" ", typeof(string));
table.Columns.Add(" ", typeof(string));
table.Columns.Add(" ", typeof(int));
table.Columns.Add(" ", typeof(int));
table.Columns.Add(" ", typeof(int));
table.Columns.Add(" ", typeof(int));
table.Columns.Add(" ", typeof(int));
table.Columns.Add(" ", typeof(int));
table.Columns.Add(" ", typeof(int));
table.Columns.Add(" ", typeof(int));
table.Columns.Add(" ", typeof(int));
table.Columns.Add(" ", typeof(int));
table.Columns.Add(" ", typeof(int));
table.Columns.Add(" ", typeof(int));
table.Columns.Add(" ", typeof(int));
table.Columns.Add(" ", typeof(int));
table.Columns.Add(" ", typeof(int));
table.Columns.Add(" ", typeof(int));
table.Columns.Add(" ", typeof(int));
table.Columns.Add(" ", typeof(int));
foreach (結果の CSVfile 行) { Console.WriteLine(row.Request_ID + " " + row.Priority);
table.Rows.Add(row.Request_ID, row.Priority);
}
しかし、問題は、グリッドビューを使用しなくても、結果をどこにでも出力させることができないということです
また、ライブラリを追加した他のコンピュータで実行するのはかなり面倒です。
今日、私のチームメイトが、変数をデータベースに入れるために使用する必要がある SQL コードをくれました。これは次のとおりです。
public string GetConnectionString()
{
return System.Configuration.ConfigurationManager.ConnectionStrings["team03ConnectionString"].ConnectionString;
//the "ConnStringName" is the name of your Connection String that was set up from the Web.Config
}
protected void BookRoom_Click(object sender, EventArgs e)
{
System.Data.SqlClient.SqlConnection conn = new System.Data.SqlClient.SqlConnection(GetConnectionString());
// string sql = "INSERT INTO tests (column6,Column2,Column3,Column4,Column5) VALUES (@Val1,@Val2,@Val3,@Val4,@Val5)";
// string sql = "Insert INTO Requests (Priority, Module_ID, Day,Start_Time, Length, Park, Students, Room_Code, Status, Semester_ID, Week_1,Week_2,Week_3,Week_4,Week_5,Week_6,Week_7,Week_8,Week_9,Week_10,Week_11,Week_12,Week_13,Week_14,Week_15) VALUES (@Priority, @Module_ID, @Day,@Start_Time, @Length, @Park, @Students, @Room_Code, @Status, @Semester_ID, @Week_1, @Week_2, @Week_3, @Week_4, @Week_5, @Week_6, @Week_7, @Week_8, @Week_9, @Week_10, @Week_11, @Week_12, @Week_13, @Week_14, @Week_15)";
string sql = "Insert INTO Requests (Priority, Module_ID, Day,Start_Time, Length, Park, Students, Room_Code, Status,Room_Allocated, Semester_ID, Week_1,Week_2,Week_3,Week_4,Week_5,Week_6,Week_7,Week_8,Week_9,Week_10,Week_11,Week_12,Week_13,Week_14,Week_15) OUTPUT INSERTED.Request_ID VALUES (@Priority, @Module_ID, @Day,@Start_Time, @Length, @Park, @Students, @Room_Code, @Status,@Room_Allocated, @Semester_ID, @Week_1, @Week_2, @Week_3, @Week_4, @Week_5, @Week_6, @Week_7, @Week_8, @Week_9, @Week_10, @Week_11, @Week_12, @Week_13, @Week_14, @Week_15)";
try
{
conn.Open();
System.Data.SqlClient.SqlCommand cmd = new System.Data.SqlClient.SqlCommand(sql, conn);
cmd.Parameters.AddWithValue("@Priority", "0");
cmd.Parameters.AddWithValue("@Module_ID", moduleSelect.Text);
cmd.Parameters.AddWithValue("@Day", Day.Text);
cmd.Parameters.AddWithValue("@Start_Time", StartTime.Text);
cmd.Parameters.AddWithValue("@Length", "1");
cmd.Parameters.AddWithValue("@Park", Request.QueryString["Pk"].ToString());
cmd.Parameters.AddWithValue("@Students", NumOfStudents.Text);
cmd.Parameters.AddWithValue("@Room_Code", roomChosen.Text);
cmd.Parameters.AddWithValue("@Status", "Pending");
cmd.Parameters.AddWithValue("@Room_Allocated", roomChosen.Text);
cmd.Parameters.AddWithValue("@Semester_ID", "7");
cmd.Parameters.AddWithValue("@Week_1", weeknumber1.Text);
cmd.Parameters.AddWithValue("@Week_2", weeknumber2.Text);
cmd.Parameters.AddWithValue("@Week_3", weeknumber3.Text);
cmd.Parameters.AddWithValue("@Week_4", weeknumber4.Text);
cmd.Parameters.AddWithValue("@Week_5", weeknumber5.Text);
cmd.Parameters.AddWithValue("@Week_6", weeknumber6.Text);
cmd.Parameters.AddWithValue("@Week_7", weeknumber7.Text);
cmd.Parameters.AddWithValue("@Week_8", weeknumber8.Text);
cmd.Parameters.AddWithValue("@Week_9", weeknumber9.Text);
cmd.Parameters.AddWithValue("@Week_10", weeknumber10.Text);
cmd.Parameters.AddWithValue("@Week_11", weeknumber11.Text);
cmd.Parameters.AddWithValue("@Week_12", weeknumber12.Text);
cmd.Parameters.AddWithValue("@Week_13", weeknumber13.Text);
cmd.Parameters.AddWithValue("@Week_14", weeknumber14.Text);
cmd.Parameters.AddWithValue("@Week_15", weeknumber15.Text);
//cmd.CommandType = System.Data.CommandType.Text;
//Int32 newId = (Int32)cmd.ExecuteScalar();
cmd.ExecuteNonQuery();
} //End of try
catch (System.Data.SqlClient.SqlException ex)
{
string msg = "Insert Error:";
msg += ex.Message;
throw new Exception(msg);
}
catch (FormatException ee)
{
System.Web.HttpContext.Current.Response.Write("<SCRIPT LANGUAGE='JavaScript'>alert('Please enter a valid value');</SCRIPT>");
}
catch (System.Exception eeee)
{
System.Web.HttpContext.Current.Response.Write("<SCRIPT LANGUAGE='JavaScript'>alert('System Exception');</SCRIPT>");
}
finally
{
conn.Close();
}
}//End of insertInfor()
}
そして彼は、日曜日までに残りを理解する必要があると私に言いました。
これらすべてを言ったので、私はコースワークを行う人を探しているのではなく、経験豊富な人からのアドバイスを探しています.asp.netは非常に混乱しているようです. 外部ライブラリを使用せずにこれを行う方法はありますか? gridview にデータベースのテーブルを表示させることはできますか? 最善のアプローチは何ですか?
どうもありがとう!
アップデート:
@ティム
すべての助けをありがとう!
これは私が現時点で持っているものです:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Data;
using System.Data.OleDb;
using FileHelpers;
namespace ImportPage
{
public class CSVFile
{
public int Request_ID { get; set; }
public int Priority { get; set; }
//...
}
public class CSV
{
public string GetConnectionString()
{ return System.Configuration.ConfigurationManager.ConnectionStrings["team03ConnectionString"].ConnectionString; }
protected void button1_Click(object sender, EventArgs e)
{
List<CSVFile> entries = new List<CSVFile>();
using (TextFieldParser parser = new TextFieldParser(@"C:\CSVDATA\PreviousYear.csv"))
{
parser.TextFieldType = FieldType.Delimited;
parser.Delimiters = new string[] { "," };
string[] fields;
while (!parser.EndOfData)
{
fields = parser.ReadFields();
entries.Add(new CSVFile()
{
Request_ID = Convert.ToInt32(fields[0]),
Priority = Convert.ToInt32(fields[1]),
//...
});
}
}
System.Data.SqlClient.SqlConnection conn = new System.Data.SqlClient.SqlConnection(GetConnectionString());
string sql = "Insert INTO Requests (Priority) OUTPUT INSERTED.Request_ID VALUES (@Priority)";
try
{
conn.Open();
System.Data.SqlClient.SqlCommand cmd = new System.Data.SqlClient.SqlCommand(sql, conn);
cmd.Parameters.AddWithValue("@Priority", "0");
cmd.ExecuteNonQuery();
} //End of try
catch (System.Data.SqlClient.SqlException ex)
{
string msg = "Insert Error:";
msg += ex.Message;
throw new Exception(msg);
}
catch (FormatException ee)
{
System.Web.HttpContext.Current.Response.Write("<SCRIPT LANGUAGE='JavaScript'>alert('Please enter a valid value');</SCRIPT>");
}
catch (System.Exception eeee)
{
System.Web.HttpContext.Current.Response.Write("<SCRIPT LANGUAGE='JavaScript'>alert('System Exception');</SCRIPT>");
}
finally
{
conn.Close();
}
}
}
}
スターター用のエントリが 2 つだけの CSV ファイルで機能するようにしようとしています: リクエスト ID と優先度、単純なものを作成してそれに基づいて構築します。
簡単に言うと、自分のコード、あなたのコード、およびチームメイトのコードを配置して何かを機能させる方法について混乱しています (コードのすべてを理解していないため)。
更新 2:
これが私の.aspxコードです。特別なことは何もありません.1つのボタンと1つのグリッドビューだけです
<!DOCTYPE html>
<script runat="server">
Protected Sub Import_button_Click(sender As Object, e As EventArgs)
End Sub
Protected Sub Page_Load(sender As Object, e As EventArgs)
End Sub
</script>
<html lang="en">
<head>
<meta charset="utf-8">
<title>Timetabling Support Website</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<!-- Loading Bootstrap -->
<link href="css/bootstrap.css" rel="stylesheet">
<!-- Loading Flat UI -->
<link href="css/flat-ui.css" rel="stylesheet">
<!-- Loading Unsemantic -->
<link href="css/unsemantic-grid-responsive.css" rel="stylesheet">
<!-- Loading Personalized Style -->
<link href="css/style.css" rel="stylesheet">
<link rel="shortcut icon" href="images/favicon.ico">
<!-- HTML5 shim, for IE6-8 support of HTML5 elements. All other JS at the end of file. -->
<!--[if lt IE 9]>
<script src="js/html5shiv.js"></script>
<![endif]-->
</head>
<body>
<form id="form1" runat="server">
<div class="grid-container">
<div class="header grid-100">
<div class="banner grid-70">
<img src="images/banner3.png" id="banner" alt="Loughborough Uni Logo" />
</div>
<div class="logout grid-30">
<p id="logout"> Welcome, Computer Science Timetabler. | <a href="index.html">Logout</a></p>
</div>
</div>
<div class="navbar navbar-inverse">
<div class="navbar-inner">
<ul class="nav">
<li>
<a href="home.html">
Home
</a>
</li>
<li>
<a href="#">
Requests
</a>
<ul>
<li>
<a href="request_new.html">New Request</a>
</li>
<li>
<a href="request_import.html">Import Requests</a>
</li>
<li>
<a href="request_current.html">Current Requests</a>
</li>
<li>
<a href="request_adhoc.html">Ad-Hoc Request</a>
</li>
</ul> <!-- /Sub menu -->
</li>
<li>
<a href="room_availability.html">
Room Availability
</a>
</li>
<li>
<a href="#">
History
</a>
<ul>
<li>
<a href="#">Semester 1</a>
<ul>
<li>
<a href="history_s1priority.html">Priority Round</a>
</li>
<li>
<a href="history_s1round1.html">Round 1</a>
</li>
<li>
<a href="history_current.html">Round 2</a>
</li>
<li>
<a href="history.html">Final Allocations</a>
</li>
</ul> <!-- /Sub menu -->
</li>
<li>
<a href="#">Semester 2</a>
<ul>
<li>
<a href="history.html">Priority Round</a>
</li>
<li>
<a href="history.html">Round 1</a>
</li>
<li>
<a href="history.html">Round 2</a>
</li>
<li>
<a href="history.html">Final Allocations</a>
</li>
</ul> <!-- /Sub menu -->
</li>
</ul> <!-- /Sub menu -->
</li>
<li>
<a href="#">
Maintenance
</a>
<ul>
<li>
<a href="module_add.html">Add Module</a>
</li>
<li>
<a href="module_edit.html">Edit Module</a>
</li>
</ul> <!-- /Sub menu -->
</li>
<li>
<a href="help.html">
Help
</a>
</li>
</ul>
</div><!--/.nav-collapse -->
</div>
<div class="content center">
<h1>Import Request
</h1>
<asp:Button ID="Button1" runat="server" Text="Button" OnClick="Import_button_Click"/>
<asp:GridView ID="GridView1" runat="server">
</asp:GridView>
</div>
<div class="grid-100 footer">
<p>Copyright © 2013 Team 3 Timetabling Support Website</p>
</div>
</div> <!-- /container -->
<asp:SqlDataSource ID="SqlDataSource1" runat="server"></asp:SqlDataSource>
<!-- Load JS here for greater good =============================-->
<script src="js/jquery-1.8.2.min.js"></script>
<script src="js/jquery-ui-1.10.0.custom.min.js"></script>
<script src="js/jquery.dropkick-1.0.0.js"></script>
<script src="js/custom_checkbox_and_radio.js"></script>
<script src="js/custom_radio.js"></script>
<script src="js/jquery.tagsinput.js"></script>
<script src="js/bootstrap-tooltip.js"></script>
<script src="js/jquery.placeholder.js"></script>
<script src="http://vjs.zencdn.net/c/video.js"></script>
<script src="js/application.js"></script>
<!--[if lt IE 8]>
<script src="js/icon-font-ie7.js"></script>
<script src="js/icon-font-ie7-24.js"></script>
<![endif]-->
</form>
</body>
</html>
コードのこの部分には多くの問題があるようです。
string sql = "Insert INTO Requests (Priority);
OUTPUT INSERTED.Request_ID
VALUES (@Priority)";
更新 3:
わかりました、そのコードを修正しました。すべてを同じ行に配置する必要がありました。アプリをビルドしようとすると、エラーが 1 つだけ表示されるようになりました。
エラー 3 型または名前空間名 'SqlCommand' が見つかりませんでした (using ディレクティブまたはアセンブリ参照がありませんか?)
そのため、SqlCommand は認識されません。認識されるように参照または何かを追加する必要がありますか? 同じことがSqlConnectionにも当てはまります
更新 4
これは、Visual Studio で動作させるため、現在使用しているコードです。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using Microsoft.VisualBasic.FileIO;
using System.Data.SqlClient;
namespace ImportPage
{
public class CSVFile
{
public int Request_ID { get; set; }
public int Priority { get; set; }
public int Module_ID { get; set; }
//...
}
public class CSV
{
public string GetConnectionString()
{ return System.Configuration.ConfigurationManager.ConnectionStrings["team03ConnectionString"].ConnectionString; }
protected void button1_Click(object sender, EventArgs e)
{
List<CSVFile> entries = new List<CSVFile>();
using (TextFieldParser parser = new TextFieldParser(@"PreviousYear.csv"))
{
parser.TextFieldType = FieldType.Delimited;
parser.Delimiters = new string[] { "," };
string[] fields;
while (!parser.EndOfData)
{
fields = parser.ReadFields();
entries.Add(new CSVFile()
{
Request_ID = Convert.ToInt32(fields[0]),
Priority = Convert.ToInt32(fields[1]),
Module_ID = Convert.ToInt32(fields[2])
//...
});
}
}
using (SqlConnection conn = new SqlConnection(GetConnectionString()))
{
string sql = "Insert INTO Requests (Priority, Module_ID) OUTPUT INSERTED.Request_ID VALUES (@Priority, @Module_ID)";
try
{
conn.Open();
foreach (CSVFile entry in entries)
{
using (SqlCommand cmd = new SqlCommand(sql, conn))
{
cmd.Parameters.AddWithValue("@Priority", entry.Priority);
cmd.Parameters.AddWithValue("@Module_ID", entry.Module_ID);
// ...
cmd.ExecuteNonQuery();
}
}
}
catch (System.Data.SqlClient.SqlException ex)
{
string msg = "Insert Error:";
msg += ex.Message;
throw new Exception(msg);
}
catch (FormatException ee)
{
System.Web.HttpContext.Current.Response.Write("<SCRIPT LANGUAGE='JavaScript'>alert('Please enter a valid value');</SCRIPT>");
}
catch (System.Exception eeee)
{
System.Web.HttpContext.Current.Response.Write("<SCRIPT LANGUAGE='JavaScript'>alert('System Exception');</SCRIPT>");
}
}
}
}
}