<?xml version="1.0" encoding="UTF-8"?>        <rss version="2.0"
             xmlns:atom="http://www.w3.org/2005/Atom"
             xmlns:dc="http://purl.org/dc/elements/1.1/"
             xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
             xmlns:admin="http://webns.net/mvcb/"
             xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
             xmlns:content="http://purl.org/rss/1.0/modules/content/">
        <channel>
            <title>
									Code Notebook Forum - נושאים אחרונים				            </title>
            <link>https://epicmarketing.co.il/notebook/community/</link>
            <description>Code Notebook Discussion Board</description>
            <language>he-IL</language>
            <lastBuildDate>Wed, 01 Jul 2026 11:53:22 +0000</lastBuildDate>
            <generator>wpForo</generator>
            <ttl>60</ttl>
							                    <item>
                        <title>איך לשלוח רשימה של אובייקטים מתוכנית c# לטבלה של SQL</title>
                        <link>https://epicmarketing.co.il/notebook/community/sql-c-api/%d7%90%d7%99%d7%9a-%d7%9c%d7%a9%d7%9c%d7%95%d7%97-%d7%a8%d7%a9%d7%99%d7%9e%d7%94-%d7%a9%d7%9c-%d7%90%d7%95%d7%91%d7%99%d7%99%d7%a7%d7%98%d7%99%d7%9d-%d7%9e%d7%aa%d7%95%d7%9b%d7%a0%d7%99%d7%aa-c/</link>
                        <pubDate>Wed, 29 Nov 2023 09:38:38 +0000</pubDate>
                        <description><![CDATA[בקריאה לפרוצדורה יש לנו אפשרות לשלוח רשימה של משתנים, אבל מה קורה אם יש לי רשימה של אובייקטים לשלוח?
נניח למשל שיש לי אתה מכירות, תהיה לי טבלת הזמנות, לשמירה של ההזמנה עצמה, ותהיה לי טבלה ש...]]></description>
                        <content:encoded><![CDATA[<p>בקריאה לפרוצדורה יש לנו אפשרות לשלוח רשימה של משתנים, אבל מה קורה אם יש לי רשימה של אובייקטים לשלוח?</p>
<p>נניח למשל שיש לי אתה מכירות, תהיה לי טבלת הזמנות, לשמירה של ההזמנה עצמה, ותהיה לי טבלה של מוצרים-לרשימה שבה ישמרו המוצרים שקשורים לרשימה. איך אפשר לשלוח את הרשימה של המוצרים כשכל מוצר הוא אובייקט עם מידע, למשל קוד המוצר, כמות מוזמנת וכו'</p>
<p>אפשר לשלוח את המוצרים אחד אחרי השני, זה יהיה הקוד של ה-API:</p>
<pre contenteditable="false">using System.Data.SqlClient;

public class OrderItem
{
    public int OrderId { get; set; }
    public int ProductId { get; set; }
    public decimal Price { get; set; }
    // Other properties
}

public void SaveOrderItems(List&lt;OrderItem&gt; orderItems)
{
    using (SqlConnection conn = new SqlConnection(connectionString))
    {
        conn.Open();

        using (SqlTransaction transaction = conn.BeginTransaction())
        {
            try
            {
                foreach (var item in orderItems)
                {
                    using (SqlCommand cmd = new SqlCommand("INSERT INTO orderItems (OrderId, ProductId, Price) VALUES (@OrderId, @ProductId, @Price)", conn, transaction))
                    {
                        cmd.Parameters.AddWithValue("@OrderId", item.OrderId);
                        cmd.Parameters.AddWithValue("@ProductId", item.ProductId);
                        cmd.Parameters.AddWithValue("@Price", item.Price);
                        // Add other parameters as necessary

                        cmd.ExecuteNonQuery();
                    }
                }

                transaction.Commit();
            }
            catch
            {
                transaction.Rollback();
                throw;
            }
        }
    }
}</pre>
<p>הבעיה היא שזה לא מתאם אם רוצים לחסוך במשאבים.</p>
<p>הדרך היותר יעילה לשלוח את הרשימה היא על ידי יצירה מקומית של טבלה ב-API ושליחה של כל הטבלה כמשתנה ל-SQL.</p>
<p><strong>שלב 1: יצירת סוג הטבלה ב-SQL, הטבלה הזאת תקבל את הנתונים שיגיעו.</strong></p>
<pre contenteditable="false">CREATE TYPE dbo.OrderItemType AS TABLE
(
    OrderId INT,
    ProductId INT,
    Price DECIMAL(18, 2)
    -- Define other columns as needed
);</pre>
<p>במקרה הזה יש לי טבלת ItemsOrder שאליה אני רוצה להכניס את הנתונים, הטבלה שאני יוצרת עכשיו היא מעין טבלה מקשרת שמקבלת אליה את הנתונים מה-API ומכניסה אותם לטבלת ItemsOrder.</p>
<p>את ההגדרות של הטבלה אפשר למצוא אחר כך תחת תיקיית Programming של מסד הנתונים בתוך תיקיית Type ושם ב- User-Defined Table Types.</p>
<p>בטבלה הזאת אני מגדירה רק את הפרמטרים שמגיעים מה-API, אין צורך להגדיר את כל השדות של הטבלה שאליה אני רוצה להכניס את הנתונים.</p>
<p>לא להגדיר בטבלה שדות של מספור אוטומטי שקיימים בטבלה אליה הנתונים נכנסים, הם אמורים לתת ערך לעצמם.</p>
<p> </p>
<p><strong>שלב 2: יצירת הפרוצדורה שמקבלת את הטבלה.</strong></p>
<pre contenteditable="false">CREATE PROCEDURE dbo.InsertOrderItems
    @OrderItems dbo.OrderItemType READONLY
AS
BEGIN
    INSERT INTO orderItems (OrderId, ProductId, Price)
    SELECT OrderId, ProductId, Price FROM @OrderItems;
END;</pre>
<p>הפרמטר של הפרוצדורה הזאת הוא טבלה. אנחנו מכניסים בהתאמה את השדות מהטבלה שקיבלנו כפרמטר לטבלה שאליה הנתונים צריכים להדיע.</p>
<p><strong>שלב 3: יצירת טבלה ב-C# ששולחת את הנתונים.</strong></p>
<pre contenteditable="false">public void SaveOrderItems(List&lt;OrderItem&gt; orderItems)
{
    using (SqlConnection conn = new SqlConnection(connectionString))
    {
        conn.Open();

        using (SqlCommand cmd = new SqlCommand("dbo.InsertOrderItems", conn))
        {
            cmd.CommandType = CommandType.StoredProcedure;

            DataTable table = new DataTable();
            table.Columns.Add("OrderId", typeof(int));
            table.Columns.Add("ProductId", typeof(int));
            table.Columns.Add("Price", typeof(decimal));
            // Add other columns as necessary

            foreach (var item in orderItems)
            {
                table.Rows.Add(item.OrderId, item.ProductId, item.Price);
                // Add other values as necessary
            }

            SqlParameter tvpParam = cmd.Parameters.AddWithValue("@OrderItems", table);
            tvpParam.SqlDbType = SqlDbType.Structured;
            tvpParam.TypeName = "dbo.OrderItemType";

            cmd.ExecuteNonQuery();
        }
    }
}</pre>
<p> </p>
<p> </p>
<p> </p>]]></content:encoded>
						                            <category domain="https://epicmarketing.co.il/notebook/community/"></category>                        <dc:creator>kerendanino</dc:creator>
                        <guid isPermaLink="true">https://epicmarketing.co.il/notebook/community/sql-c-api/%d7%90%d7%99%d7%9a-%d7%9c%d7%a9%d7%9c%d7%95%d7%97-%d7%a8%d7%a9%d7%99%d7%9e%d7%94-%d7%a9%d7%9c-%d7%90%d7%95%d7%91%d7%99%d7%99%d7%a7%d7%98%d7%99%d7%9d-%d7%9e%d7%aa%d7%95%d7%9b%d7%a0%d7%99%d7%aa-c/</guid>
                    </item>
				                    <item>
                        <title>איך לקרוא ל-2 פרוצדורות של SQL מתוכנית C#?</title>
                        <link>https://epicmarketing.co.il/notebook/community/sql-c-api/%d7%90%d7%99%d7%9a-%d7%9c%d7%a7%d7%a8%d7%95%d7%90-%d7%9c-2-%d7%a4%d7%a8%d7%95%d7%a6%d7%93%d7%95%d7%a8%d7%95%d7%aa-%d7%a9%d7%9c-sql-%d7%9e%d7%aa%d7%95%d7%9b%d7%a0%d7%99%d7%aa-c/</link>
                        <pubDate>Wed, 29 Nov 2023 09:23:19 +0000</pubDate>
                        <description><![CDATA[כדי לקרוא לשתי פרוצדורות אפשר להשתמש באחת מהדרכים הנפוצות האלה:
1. קריאה סדרתית לפרוצדורות.
using (SqlConnection conn = new SqlConnection(connectionString))
{
    conn.Open();
    using...]]></description>
                        <content:encoded><![CDATA[<p>כדי לקרוא לשתי פרוצדורות אפשר להשתמש באחת מהדרכים הנפוצות האלה:</p>
<p><strong>1. קריאה סדרתית לפרוצדורות.</strong></p>
<pre contenteditable="false">using (SqlConnection conn = new SqlConnection(connectionString))
{
    conn.Open();
    using (SqlCommand cmd = new SqlCommand("StoredProcedure1", conn))
    {
        cmd.CommandType = CommandType.StoredProcedure;
        // Set parameters for cmd here
        cmd.ExecuteNonQuery();
    }
    using (SqlCommand cmd = new SqlCommand("StoredProcedure2", conn))
    {
        cmd.CommandType = CommandType.StoredProcedure;
        // Set parameters for cmd here
        cmd.ExecuteNonQuery();
    }
}</pre>
<p>2. עטיפת 2 הפוצדורות בשלישית ב-SQL וקריאה לפרוצדורה העוטפת.</p>
<p>קוד ה-SQL יראה כך:</p>
<pre contenteditable="false">CREATE PROCEDURE dbo.WrapperProcedure
AS
BEGIN
    EXEC dbo.StoredProcedure1;
    EXEC dbo.StoredProcedure2;
END;</pre>
<p>קוד ה-API יקרא לפרוצדורה:</p>
<pre contenteditable="false">using (SqlConnection conn = new SqlConnection(connectionString))
{
    conn.Open();
    using (SqlCommand cmd = new SqlCommand("WrapperProcedure", conn))
    {
        cmd.CommandType = CommandType.StoredProcedure;
        cmd.ExecuteNonQuery();
    }
}</pre>
<p>אם יש צורך לשלוח פרמטרים לשתי הפרוצדורות, נגדיר את כל הפרמטרים ב-API ונקבל לכל פרוצדורה את הפרמטרים שמתאימים לה.</p>
<p>כל פרוצדורה מקבלת את הפרמטרים שלה:</p>
<pre contenteditable="false">CREATE PROCEDURE dbo.WrapperProcedure
    @Param1 DataType1,
    @Param2 DataType2
AS
BEGIN
    -- Call the first stored procedure
    EXEC dbo.StoredProcedure1 @Param1;

    -- Call the second stored procedure
    EXEC dbo.StoredProcedure2 @Param2;
END;</pre>
<p>בקריאה של ה-API כל הפרמטרים נשלחים יחד:</p>
<pre contenteditable="false">using System.Data;
using System.Data.SqlClient;

// ...

using (SqlConnection conn = new SqlConnection(connectionString))
{
    conn.Open();

    using (SqlCommand cmd = new SqlCommand("WrapperProcedure", conn))
    {
        cmd.CommandType = CommandType.StoredProcedure;

        // Add parameters for the wrapper procedure
        cmd.Parameters.Add(new SqlParameter("@Param1", valueForParam1));
        cmd.Parameters.Add(new SqlParameter("@Param2", valueForParam2));

        // Execute the wrapper procedure
        cmd.ExecuteNonQuery();
    }
}</pre>
<p> </p>
<p> </p>]]></content:encoded>
						                            <category domain="https://epicmarketing.co.il/notebook/community/"></category>                        <dc:creator>kerendanino</dc:creator>
                        <guid isPermaLink="true">https://epicmarketing.co.il/notebook/community/sql-c-api/%d7%90%d7%99%d7%9a-%d7%9c%d7%a7%d7%a8%d7%95%d7%90-%d7%9c-2-%d7%a4%d7%a8%d7%95%d7%a6%d7%93%d7%95%d7%a8%d7%95%d7%aa-%d7%a9%d7%9c-sql-%d7%9e%d7%aa%d7%95%d7%9b%d7%a0%d7%99%d7%aa-c/</guid>
                    </item>
				                    <item>
                        <title>איך לשנות הגדרות של עמודה ב-SQL</title>
                        <link>https://epicmarketing.co.il/notebook/community/main-category-sql/%d7%90%d7%99%d7%9a-%d7%9c%d7%a9%d7%a0%d7%95%d7%aa-%d7%94%d7%92%d7%93%d7%a8%d7%95%d7%aa-%d7%a9%d7%9c-%d7%a2%d7%9e%d7%95%d7%93%d7%94-%d7%91-sql/</link>
                        <pubDate>Wed, 29 Nov 2023 08:56:03 +0000</pubDate>
                        <description><![CDATA[אם רוצים לשנות הגדרות של עמודה, למשל לשנות את סוג הנתונים של העמודה, צריך לקרוא לשינוי טבלה ובתוך זה לשינוי העמודה. הקוד מתייחס ל-SQL Server. זאת התבנית הכללית:
ALTER TABLE table_name
ALTE...]]></description>
                        <content:encoded><![CDATA[<p>אם רוצים לשנות הגדרות של עמודה, למשל לשנות את סוג הנתונים של העמודה, צריך לקרוא לשינוי טבלה ובתוך זה לשינוי העמודה. הקוד מתייחס ל-SQL Server. זאת התבנית הכללית:</p>
<pre contenteditable="false">ALTER TABLE table_name
ALTER COLUMN column_name datatype;</pre>
<p>למשל אם אני רוצה לשנות את אורך התיאור בטבלת המוצרים שלי, הקוד יהיה כזה:</p>
<pre contenteditable="false">ALTER TABLE product
ALTER COLUMN description VARCHAR(250);</pre>
<p>אם רוצים לעשות שינוי כך שעמודה תקבל מספור אוטומטי, אי אפשר לעשות את זה ישירות, צריך קודם לבטל את העמודה הקיימת ואז להוסיף אותה מחדש.</p>
<pre contenteditable="false">ALTER TABLE YourTable
DROP COLUMN OldColumn;</pre>
<p>אחרי ביטול העמודה:</p>
<pre contenteditable="false">ALTER TABLE YourTable
ADD NewColumn INT IDENTITY(1,1);</pre>
<p>אם העמודה היא גם מפתח ראשי, זה יראה ככה:</p>
<pre contenteditable="false">ALTER TABLE YourTable
ADD NewColumn INT IDENTITY(1,1) PRIMARY KEY;</pre>
<p>צריך לשים לב, שאם העמודה מוגדרת כמפתח ראשי, אי אפשר לבטל אותה. צריך קודם לבל את המפתח הראשי. כדי לעשות את זה צריך את השם של המפתח הראשי. </p>
<p>ב-SQL Server זה נמצא תחת תיקיית Keys שנמצאת מתחת לטבלה.</p>
<p>מבטלים את המפתח הראשי:</p>
<pre contenteditable="false">ALTER TABLE YourTable
DROP CONSTRAINT PK_YourTable_CurrentPrimaryKey;</pre>
<p>ואז אפשר לבטל את העמודה.</p>
<p>כדי להגדיר עמודה כמפתח ראשי, נשתמש בקוד הבא:</p>
<pre contenteditable="false">ALTER TABLE YourTable
ADD CONSTRAINT PK_YourTable_NewPrimaryKey PRIMARY KEY (NewPrimaryKeyColumn);</pre>
<p>אם לא מצליחים למצוא את השם של המפתח הראשי, אפשר להשתמש בקוד הבא:</p>
<pre contenteditable="false">SELECT *
FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS
WHERE TABLE_NAME = 'YourTableName' AND CONSTRAINT_TYPE = 'PRIMARY KEY';</pre>
<p> </p>
<p> </p>]]></content:encoded>
						                            <category domain="https://epicmarketing.co.il/notebook/community/"></category>                        <dc:creator>kerendanino</dc:creator>
                        <guid isPermaLink="true">https://epicmarketing.co.il/notebook/community/main-category-sql/%d7%90%d7%99%d7%9a-%d7%9c%d7%a9%d7%a0%d7%95%d7%aa-%d7%94%d7%92%d7%93%d7%a8%d7%95%d7%aa-%d7%a9%d7%9c-%d7%a2%d7%9e%d7%95%d7%93%d7%94-%d7%91-sql/</guid>
                    </item>
							        </channel>
        </rss>
		