Npgsql.NpgsqlException: 'Exception while reading from stream'
TimeoutException: Timeout during reading attempt
npgsql timeout during reading attempt
DB connection 후
코드 인으로 쿼리를 때려 박고 DataAdapter 에 저장하고 DataSet에 넣어야 하는데 쿼리 돌리는 속도가 오래 걸려서인지 계속 timeout 예외가 떴다
처음에는 서버 문제인 줄 알아서 postgresql을 다시 연결해 준 다음에 실행하니 dataset에 문제없이 해당 데이터가 담겼었다. 그런데 분명히 같은 select 문이었음에도 불구하고 또 같은 에러가 뜨는 것이다........... 왜 됐다가 안 되는지는 잘 모르겠지만 아마 메모리 누수 때문일 수도 있고 리소스 많이 잡아 먹어서 그럴 수도 있다.
아무튼 서버 문제도 아니니 해결 방법은 시간을 늘려주는 것이니 connection 부분에서 시간을 늘려 주었다.
dbeaver로 postgresql 작업을 하다가 갑자기 에러창이 뜨면서 log 파일을 확인하라는 메세지가 떴다.
ide 켜지지도 않고 이유 찾아보다가 포기하고 이틀 정도 그냥 pgadmin으로 작업한 듯......
이대로는 안 되겠다 싶어서 구글링으로 다시 찾아보니까 겨우 찾았다 근데 별문제 아니었음
dbeaver를 실행시키면 이런 경고창이 뜨고 꺼진다
See the log file C:/Users/user/AppData/Roaming/DBeaverData/workspace6/.metadata/.log"
해당 경로에 가서 log 파일을 확인해 보면
Caused by: java.lang.Exception: 호환되지 않는 파일 형식입니다. 작업공간이 호환되지 않는 0 버전으로 저장되었습니다. at org.eclipse.core.internal.resources.ResourceException.provideStackTrace(ResourceException.java:42) at org.eclipse.core.internal.resources.ResourceException.<init>(ResourceException.java:38) ... 50 more
using System.Data.SqlClient;
using System.Data;
// using 등록해야 할 것들
public IActionResult TicketList()
{
var dt = new DataTable();
// 다른 곳에서 참조가 되면 남아 있을 수 있기 때문에 명시적으로 코딩 하는 게 좋음 (using)
using (var conn = new SqlConnection("Server=DESKTOP-2H5KO6N\\SQLEXPRESS;Database = myweb;User ID = sa;password = sa1234"))
{
conn.Open();
#region [sql 구문 작성법]
/*
* string sta = "ddd"
WHERE 구문에서 a.status = sta + '%' 이런 식으로 쓰면 안 되는 이유
-> 사용자가 악의적으로 sta 변수에 OR '1' = '1' 같은 변수를 넣었을 경우 select 문으로 테이블의 모든 값을 조회할 수
있기 때문에 보안상으로도 올바르지 않음 (sql 해킹법으로 많이 쓰인다)
*/
#endregion
using (var cmd = new SqlCommand())
{
string status = "In Progress";
cmd.Connection = conn;
cmd.CommandText = @"
SELECT
A.ticket_id
,A.title
,A.status
FROM
t_ticket A
WHERE
A.status = @status
";
cmd.Parameters.AddWithValue("@status", status);
var reader = cmd.ExecuteReader(); // READ 부분 select~
dt.Load(reader);
//cmd.ExecuteNonQuery(); // CURD 처리 부분 (insert, update, delete) int 값 반환
}
}
ViewData["Dt"] = dt;
return View();
}
- HomeController.cs
DB 연동 방법 다양함. appsettings.json에서 바로 연동해 주는 방법이 있고, 해당 페이지에서만 연동해 주는 방법이 있는데
해당 페이지에서만 연동하는 방법으로 HomeController에서 ticketList 페이지에서만 ticket 테이블 조회할 수 있도록 연동
@{
var dt = ViewData["dt"] as System.Data.DataTable;
}
-- 해당하는 html의 cshtml 위에 데이터 테이블 전달
<tbody>
@foreach(System.Data.DataRow row in dt.Rows)
{
<tr>
<td>@row["status"]</td>
<td>@row["title"]</td>
<td>@row["ticket_id"]</td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
}
</tbody>
- TempData, Cache 등으로 생명주기를 늘릴 수 있으나, 웹서버 종료 시 삭제됨
2. 영속성(Persistence)
- 메모리가 아닌 별도의 저장공간을 이용하여, 영구적인 저장을 가능하도록 함
- 영속성이라는 의미는 데이터의 불변성이 아님
- 즉, 서버를 껐다 켜도 데이터가 살아 있느냐를 생각해 보면 된다.
(웹서버 IIS나 Tomcat 같은 것)
데이터 베이스 서버 (Maria DB, oracle, MSSQL... ) RDBMS
3.
MariaDb - License 문제에서 자유로움
- MS-SQL Express 또는 Oracle XE 가 있으나 제약이 큼
- ANSI SQL 기준으로 쿼리를 만들 것이므로 다른 DB에도 쉽게 적용이 가능하다.
-> 우리는 DB MSSQL로 진행
4. ADO.NET 예제
- CRUD(Create, Read, Update, Delete) 예제
5. Dapper 예제
- ADO.NET 로 만든 CRUD 를 Dapper로 변경
JAVA - DB 연결
1. JDBC
2. JDBC mybatis ibatis
3. JDBC Hibernate (DB에 있는 테이블이나 컬럼들이 하나의 오브젝트고, 프로퍼티가 되는 것. 그것을 자바 코드와 연결해서 매핑시켜 줌)
C#에서 DB 연결하는 방법
1. ADO.NET (가장 기본적인 DB 연결 방식)
using System;
using System.Data;
using System.Data.SqlClient;
class Program
{
static void Main()
{
string connectionString =
"Data Source=(local);Initial Catalog=Northwind;"
+ "Integrated Security=true";
// Provide the query string with a parameter placeholder.
string queryString =
"SELECT ProductID, UnitPrice, ProductName from dbo.products "
+ "WHERE UnitPrice > @pricePoint "
+ "ORDER BY UnitPrice DESC;";
// Specify the parameter value.
int paramValue = 5;
// Create and open the connection in a using block. This
// ensures that all resources will be closed and disposed
// when the code exits.
using (SqlConnection connection =
new SqlConnection(connectionString))
{
// Create the Command and Parameter objects.
SqlCommand command = new SqlCommand(queryString, connection);
command.Parameters.AddWithValue("@pricePoint", paramValue);
// Open the connection in a try/catch block.
// Create and execute the DataReader, writing the result
// set to the console window.
try
{
connection.Open();
SqlDataReader reader = command.ExecuteReader();
while (reader.Read())
{
Console.WriteLine("\t{0}\t{1}\t{2}",
reader[0], reader[1], reader[2]);
}
reader.Close();
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
Console.ReadLine();
}
}